使用Python将Unicode编码为iso8859-15

lut*_*utz 3 python unicode encoding encode iso-8859-15

我正在使用Python 2.7.6,我正在尝试将基本的unicode字符串转换为iso8859-15.

尝试转换带有非ASCII字符的字符串时出错.这可能没问题,当这些字符不存在时是iso8859-15编码,但在这种情况下它们会:

例:

>>> import codecs
>>> a = "test"
>>> a
'test'
>>> a.encode ('iso8859-15')
'test'
>>> a = "ü"
>>> a
'\xfc'
>>> a.encode ('iso8859-15')
Run Code Online (Sandbox Code Playgroud)

错误代码:

Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    a.encode ('iso8859-15')
  File "C:\Python27\lib\encodings\iso8859_15.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"ü"是一个有效的iso8859-15 char,其中十六进制值为fc或11111100为二进制.查看"C:\ Python27\lib\encodings\iso8859_15.py",第300行中的值为FC:

    47:  decoding_table = (
    48:  u'\x00'     #  0x00 -> NULL
    .....
    300: u'\xfc'     #  0xFC -> LATIN SMALL LETTER U WITH DIAERESIS 
Run Code Online (Sandbox Code Playgroud)

如何将非ascii字符(如"ü")的unicode字符串转换为"iso8859-15"?如果函数encode在这种情况下不起作用:如何将lib\encodings\iso8859_15.py中的encoding_table列表直接导入到我的代码中?

Mar*_*ers 7

您正在尝试编码字节字符串.bytestring已经被编码,因此Python会尝试首先为你解码它,然后再对它进行编码,并且它将使用ASCII来做到这一点.

例外反映了这一点; 你有一个UnicodeDecodeError,而不是UnicodeEncodeError.

要创建unicode值,请改用u'...'unicode文字:

>>> a = u'ü'
>>> a
u'\xfc'
>>> a.encode('iso8859-15')
'\xfc'
Run Code Online (Sandbox Code Playgroud)

或使用有效编码将您的bytestring数据解码为Unicode:

>>> a = 'ü'
>>> a.decode('utf8')  # my terminal is configured to use UTF-8
u'\xfc'
>>> a.decode('utf8').encode('iso8859-15')
'\xfc'
Run Code Online (Sandbox Code Playgroud)