Уведомления

Группа в Telegram: @pythonsu

#1 Май 16, 2008 08:32:56

Spektr
От:
Зарегистрирован: 2008-05-14
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

maketrans и utf-8

Пишу

# -*- 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)


Как быть?



Офлайн

#2 Май 16, 2008 13:53:32

Spektr
От:
Зарегистрирован: 2008-05-14
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

maketrans и utf-8

Мда в перле это решается 2 строчками

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

Питон такого не осилит?



Офлайн

#3 Май 16, 2008 15:06:51

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

maketrans и utf-8

# -*- 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)



Офлайн

#4 Май 16, 2008 16:24:59

Spektr
От:
Зарегистрирован: 2008-05-14
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

maketrans и utf-8

Похоже модуль 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

Не ожидал, что с базовыми операциями существует такой гемор.



Офлайн

#5 Май 16, 2008 16:57:20

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

maketrans и utf-8

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ируем
>>> 



Офлайн

#6 Май 16, 2008 17:27:00

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

maketrans и utf-8

Как я понимаю, официальный путь - использовать codecs совместно с unicode строками. Остальное - от лукавого



Офлайн

#7 Май 16, 2008 19:01:53

umup
От:
Зарегистрирован: 2007-07-14
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

maketrans и utf-8


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'йцукен')



Офлайн

#8 Май 16, 2008 19:09:41

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

maketrans и utf-8

u'йцукен'.translate(…) – рвет всех по читаемости. остальное – велосыпеды.



Офлайн

#9 Май 16, 2008 19:11:35

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

maketrans и utf-8

Spektr
Мда в перле это решается 2 строчками

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

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



Офлайн

#10 Май 16, 2008 22:01:30

Spektr
От:
Зарегистрирован: 2008-05-14
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

maketrans и utf-8

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

bialix :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version