在python< = 2.7中编写unicode程序

时间:2013-08-27 20:34:47

标签: python unicode python-unicode

在python< = 2.7中编写unicode程序的一般指导原则是什么?使用u前缀每个字符串是不错的做法,即使它不包含ASCII范围之外的任何字符?

在处理sqlite3时,参数化查询会自动将unicode编码为utf-8,还是需要手动完成?

当处理字符串'字符串'时,它应该保留为字符串对象还是解码为unicode字符串? (我相信这会在大多数情况下抛出异常)

如果出于任何原因我需要在代码中使用文字unicode字符,我可以只在字符串中使用该字符,只要它是一个unicode字符串并且我在文件顶部声明了我的编码吗? / p>

编辑:打印unicode字符串时,如何获取用户系统的语言环境以便我能正确编码?盲目地将所有内容编码为utf-8似乎是一个坏主意,因为并非所有系统都支持它。 编辑:我相信我认为这一个。可以使用locale

完成
import locale
encoding = locale.getpreferredencoding()
编辑:这种编码是否实际上是隐式完成的?现在我很困惑。在linux上,我可以这样做

s = u'\u2c60'
print s # prints Ⱡ
print s.encode('utf-8') # prints Ⱡ

但在Windows上会发生这种情况

s = u'\u2c60'
print s # prints Ⱡ in IDLE, UnicodeEncodeError in cmd
print s.encode('cp1252') # UnicodeEncodeError
print s.encode('utf-8') # prints â±
print s.encode('cp1252', 'replace') # prints ?

看起来印刷似乎隐含地进行转换......

编辑:这个问题说print会自动编码为存储在sys.stdout.encoding中的编码 Why Does Python print unicode characters when the default encoding is ASCII?

现在我想知道,有没有办法让print的默认行为替换不可编码的字符?或者我需要在我自己的函数中包装print,例如:

def myPrint(msg):
    print msg.encode(sys.stdout.encoding, 'replace')

我知道Python 3中已经解决了大部分这些问题,但我想支持python< = 2.7。

1 个答案:

答案 0 :(得分:1)

  

使用u前缀每个字符串是不错的做法,即使它不包含ASCII范围之外的任何字符?

是的,并且还使用与unicode一起使用的编辑器,并在每个文件的顶部声明编码类型。

通常,您的模式应该是:读取字节,在内部使用unicode,输出字节。

  

在处理sqlite3时,参数化查询会自动将unicode编码为utf-8,还是需要手动完成?

最好是安全而不是抱歉,但总的来说,我建议你自己测试一下。

  

当处理字符串'字符串'时,它应该保留为字符串对象还是解码为unicode字符串? (我相信这会在大多数情况下抛出异常)

是的,使用unicode在内部工作。不,如果你真的知道编码,这不会抛出异常。你应该知道编码。确保您知道编码。

  

如果出于任何原因我需要在代码中使用文字unicode字符,我可以只在字符串中使用该字符,只要它是一个unicode字符串并且我在文件顶部声明了我的编码吗? / p>

是的,只要您的编辑器是unicode友好的。