2012-03-03 2 views
0

Я бегу Ubuntu 10.04 LTS, Python 2.6.5 (R265: 79063, 16 апреля 2010, 13:09:56)декодирования/кодирования строки, 'Šiven завершения заполнения', но получение ' xa6iven'

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

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

ответ

6

В 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.

Если это не так, то вы должны использовать Юникод побеги:

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

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

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

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

+0

m от чего-то вроде M = file.readlines() ... для m in M: ... как я могу здесь утверждать: m = u'Šiven '? – Kristian

+1

Вам не нужны «readlines», вы можете просто перебирать файл (и это сократит вдвое ваши потребности в памяти). Вы должны действительно проконсультироваться [other] (http://stackoverflow.com/questions/491921/unicode-utf8-reading-and-writing-to-files-in-python) [вопросы] (http://stackoverflow.com/ вопросы/147741/character-reading-from-file-in-python), или, если эти вопросы (и те, которые вы искали), и их лучшие ответы не решают вашу проблему, задайте новый вопрос самостоятельно. Короче говоря, используйте ['codecs.open'] (http://docs.python.org/library/codecs.html#codecs.open). – phihag

0

Возможно, вы должны поставить # -*- 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 - ваш друг; используй это. :)

+0

У меня есть файлы, содержащие эти строки в utf-8, также скрипт python, консоль ... – Kristian