2012-03-03 36 views
0

我运行Ubuntu 10.04 LTS,Python的2.6.5(R265:79063,2010年4月16日,13时09分56秒)解码/编码字符串,submiting 'Š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中,单引号表示一个字符串字节,而不是字符。你想要一个字符串,这是在2.x的前缀u

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

m是从这样的somehing M = file.readlines()...为m在M:...我怎么能说在这里:m =u'Šiven'? – Kristian 2012-03-03 14:06:29

+1

你不需要那里的'readlines',你可以迭代文件(这会减少内存需求)。你应该真的咨询[其他](http://stackoverflow.com/questions/491921/unicode-utf8-reading-and-writing-to-files-in-python)[问题](http://stackoverflow.com/问题/ 147741 /从python中读取文件),或者,如果这些问题(以及您搜索的问题)和他们的最佳答案无法解决您的问题,请自己提出一个新问题。总之,使用['codecs.open'](http://docs.python.org/library/codecs.html#codecs.open)。 – phihag 2012-03-03 14:12:58

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 2012-03-03 18:37:11