декодирование / кодирование строк, отправка 'Šiven', но получение '\ xa6iven' - PullRequest
0 голосов
/ 03 марта 2012

Я использую Ubuntu 10.04 LTS, Python 2.6.5 (r265: 79063, 16 апреля 2010, 13:09:56)

>>> m = 'Šiven'
>>> m
'\xa6iven'
>>> unicode(m)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa6 in position 0: ordinal not in range(128)

Как мне правильно настроить его (кодирование, декодирование), чтобы оно точно записывало то, что читает?

Ответы [ 2 ]

6 голосов
/ 03 марта 2012

В Python 2.x одинарные кавычки обозначают строку байт , а не символы.Вам нужна строка символ , в которой префикс u указан в 2.x:

>>> m = u'Šiven'
>>> print(m)
Šiven
>>> m.encode('utf-8') # Get the corresponding UTF-8 bytestring
'\xc5\xa0iven'

Обратите внимание, что это работает, только если кодировка вашего терминала соответствует кодировке вашей платформы.Вам действительно нужно просто установить оба значения в UTF-8.

Если это не так, вам следует использовать экранирование Unicode:

>>> m = u'\u0160iven'
>>> print(m)
Šiven
>>> m.encode('utf-8')
'\xc5\xa0iven'

В файле Python (не в терминале) вы можетеустановите кодировку в соответствии с PEP 263 , запустив файл следующим образом:

# -*- coding: utf-8 -*-

Вы также можете использовать Python 3.x, который устраняет путаницу между байтами и символьными строками..

0 голосов
/ 03 марта 2012

Вам, вероятно, следует в любом случае поставить # -*- coding: utf-8 -*- и использовать редакторы и все остальное в режиме utf-8, чтобы избежать этих проблем, но если вы хотите выяснить, какая кодировка лучше всего подходит для вашего текущего ввода, вы можете попробовать этот скрипт (замените 'some string' с чем-то более локализованным):

encodings = ['ascii', 'cp037', 'cp424', 'cp437', 'cp500', 'cp720', 'cp737', 'cp775', 'cp850', 'cp852', 'cp855', 'cp856', 'cp857', 'cp858', 'cp860', 'cp861', 'cp862', 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', 'cp874', 'cp875', 'cp932', 'cp949', 'cp950', 'cp1006', 'cp1026', 'cp1140', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254', 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'latin_1', 'iso8859_2', 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9', 'iso8859_10', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'johab', 'koi8_r', 'koi8_u', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2', 'mac_roman', 'mac_turkish', 'ptcp154', 'utf_32', 'utf_32_be', 'utf_32_le', 'utf_16', 'utf_16_be', 'utf_16_le', 'utf_7', 'utf_8', 'utf_8_sig']

def test(s):
    for enc in encodings:
        try:
            u = unicode(s, enc)
            print u, enc
        except: pass

test('some string')

Как говорится, utf-8 - твой друг; используй это. :)

...