Spektr
			  Май 16, 2008 08:32:56
		 	 
			
				Пишу
# -*- coding: utf-8 -*-
import string
s = u“тест”
table1 = string.maketrans(“йцукен”,“qwerty”)
s.translate(table2)
Ругается что 
maketrans arguments must have same length
Пробую так
# -*- coding: utf-8 -*-
import string
s = u“тест”
table1 = string.maketrans(u“йцукен”,u“qwerty”)
s.translate(table2)
Орет
exceptions.UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-5: ordinal not in range(128)			
		
Как быть?
			
		 
		
			
			  Spektr
			  Май 16, 2008 13:53:32
		 	 
			
				Мда в перле это решается 2 строчками
use encoding “UTF-8”;
$test =~ tr/qwerty/йцукен/;
Питон такого не осилит?
			
		 
		
			
			  ZAN
			  Май 16, 2008 15:06:51
		 	 
			
				# -*- coding: utf-8 -*-
import string
s = “тест”
print len(“йцукен”)
print len(“qwerty”)
12
6
Ошибка возникла потому, что кодировка файла - utf-8 (кириллические символы - двухбайтовые). В восьмибитной кодировке такой проблемы нет.import string
s = “тест”
table1 = string.maketrans(“йцукен”,“qwerty”)
print s.translate(table1)
тtст
В обеих случаях юникод объекты смешиваются со строками, в таких случаях нужно быть очень внимательным (так, например, string.maketrans ожидает экземпляры str, а не unicode)
			
		 
		
			
			  Spektr
			  Май 16, 2008 16:24:59
		 	 
			
				Похоже модуль string (в отличии от re например) не поддерживает работу с интернациональными символами в юникоде.
Однако различные перекодировки decode encode из utf8 (в cp1251 например) тоже ничего не дали, maketrans перестает ругаться, однако на выходе ничего не преобразовывает.
И зачем нужна эта библиотека тогда? 
Пришлось лепить такой велосипед.
uni = u“werty”
w=0
for i in list(u“qwerty”):
    char = (i)
    char2 = u“йцукен”
    w=w+1
    uni = uni.replace(char,char2)
print uni
Не ожидал, что с базовыми операциями существует такой гемор.
			
		 
		
			
			  slivlen
			  Май 16, 2008 16:57:20
		 	 
			
				Spektr
Однако различные перекодировки decode encode из utf8 (в cp1251 например) тоже ничего не дали, maketrans перестает ругаться, однако на выходе ничего не преобразовывает.
Выглядит стремно, но все же работает :)
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import string
>>> test_str = u'Тестируем'
>>> test_str = test_str.encode('cp1251')
>>> tbl = string.maketrans(u'тс'.encode('1251'), 'ts')
>>> print test_str.translate(tbl).decode('cp1251').encode('utf-8')
Теstируем
>>> 
 
			 
		 
		
			
			  Андрей Светлов
			  Май 16, 2008 17:27:00
		 	 
			
				Как я понимаю, официальный путь - использовать codecs совместно с unicode строками. Остальное - от лукавого
			
		 
		
			
			  umup
			  Май 16, 2008 19:01:53
		 	 
			
				
def str_tran(str_in, table_in, table_out) :
  str_out = ''
  for chr_in in list(str_in) :
    try : str_out += table_out
    except : str_out += chr_in
  return str_out
print str_tran(u'trewq123', u'qwerty', u'йцукен')
			
		 
		
			
			  bialix
			  Май 16, 2008 19:09:41
		 	 
			
				u'йцукен'.translate(…) – рвет всех по читаемости. остальное – велосыпеды.
			
		 
		
			
			  bialix
			  Май 16, 2008 19:11:35
		 	 
			
				Spektr
Мда в перле это решается 2 строчками
use encoding “UTF-8”;
$test =~ tr/qwerty/йцукен/;
Питон такого не осилит?
А не надо на Питоне писать программы на Перле. И все будет хорошо.
В Питоне зачастую задача решается совсем по-другому и тоже получается кратко. Когда программируете на Питоне – забудьте про Перл и переключайте мозги на Питон. Окей?
			
 
		 
		
			
			  Spektr
			  Май 16, 2008 22:01:30
		 	 
			
				Добрался до линуксовой тачки и попробовал еще раз вариант с энкодом в cp1251 - заработало.
 В винде, как я писал ошибок не вызывало, но ничего не давало на выход.
 Ну так как скрипт для линукса, проблему можно считать решенной.)
bialix :)