Найти - Пользователи
Полная версия: maketrans и utf-8
Начало » Python для экспертов » maketrans и utf-8
1
Spektr
Пишу

# -*- 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
Мда в перле это решается 2 строчками

use encoding “UTF-8”;
$test =~ tr/qwerty/йцукен/;

Питон такого не осилит?
ZAN
# -*- 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
Похоже модуль 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
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ируем
>>> 
Андрей Светлов
Как я понимаю, официальный путь - использовать codecs совместно с unicode строками. Остальное - от лукавого
umup

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
u'йцукен'.translate(…) – рвет всех по читаемости. остальное – велосыпеды.
bialix
Spektr
Мда в перле это решается 2 строчками

use encoding “UTF-8”;
$test =~ tr/qwerty/йцукен/;

Питон такого не осилит?
А не надо на Питоне писать программы на Перле. И все будет хорошо.
В Питоне зачастую задача решается совсем по-другому и тоже получается кратко. Когда программируете на Питоне – забудьте про Перл и переключайте мозги на Питон. Окей?
Spektr
Добрался до линуксовой тачки и попробовал еще раз вариант с энкодом в cp1251 - заработало.
В винде, как я писал ошибок не вызывало, но ничего не давало на выход.
Ну так как скрипт для линукса, проблему можно считать решенной.)

bialix :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB