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 :)