带有土耳其字符的字符串,用于unicode

时间:2013-11-18 12:48:52

标签: python unicode encoding utf-8 locale

在ubuntu上:

> s = 'kasım' # ı -> 'i' without dot, lowercase letter, turkish.
> print s
> 'kas\xc4\xb1m'
> unicode(s, 'utf-8') 

工作正常。

在Windows上

> s = 'kasım' # ı -> 'i' without dot, lowercase letter, turkish.
> print s
> 'kas\x8dm'
> unicode(s, 'utf-8') 

抛出unicodedecode错误;

  • 'utf-8'编解码器无法解码位置3中的字节0xfd:无效的起始字节*

之前,语言环境在代码中设置,如下面的代码:

 if platform is windows:
         locale_to_set = 'turkish'
 elif platform is linux:
          locale_to_set = 'tr_TR.utf-8'

 locale.setlocale(locale.LC_ALL, locale_to_set)

我错误或错过的部分是什么?任何想法将不胜感激。

请注意:
我从datetime.datetime.utcnow()。strftime(....)得到'Kasım'字(意思是11月),用户可以根据偏好改变语言。

2 个答案:

答案 0 :(得分:2)

依赖系统的输入编码是一个坏主意,因为正如您所发现的那样,系统的不同可能因系统而异。因此,最好避免源代码中使用非ASCII字符并使用符号名称。例如:

name = u'kas\u0131m'

如果您的字符串来自系统中的其他位置,例如来自本地化的strftime函数,则在将其解码为Unicode时,您将需要使用正确的语言环境:

ignore, encoding = locale.getlocale()
name = unicode(s, encoding)

答案 1 :(得分:2)

你要求python将一系列字节转换为unicode字符串,并说这些字节是utf-8编码的。但是你自己的代码otutput表明,在windows下,一系列字节不在utf-8中,这就是你得到错误的原因。

在没有评论根据操作系统设置不同语言环境的决定的情况下,要使代码生效,您需要在行中的Windows下运行时指定不同的字符集

unicode(s, 'utf-8') 

- 通过在Windows下将语言环境设置为“土耳其语”来设置任何字符集。