使用Python <= 2.7编写Unicode程序

3
在Python <= 2.7中编写Unicode程序的一些基本指南是什么?即使字符串不包含ASCII范围以外的字符,每个字符串都加上'u'前缀是否是一种好的实践方式?
处理sqlite3时,参数化查询是否会自动将Unicode编码为UTF-8,还是需要手动完成?
在处理字节"字符串"时,应该将其保留为字符串对象还是解码为Unicode字符串?(我认为这在大多数情况下会引发异常)
如果由于任何原因我需要在代码中使用文字Unicode字符,只要它是Unicode字符串并且我在文件顶部声明了我的编码,我就可以在字符串中使用该字符吗?
编辑:打印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会隐式地进行转换...

编辑:这个问题说,print将自动编码为存储在sys.stdout.encoding中的编码。 为什么Python在默认编码为ASCII时打印Unicode字符?

现在我想知道,是否有一种方法可以使print的默认行为替换无法编码的字符?还是我需要在自己的函数中包装print,类似于:

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

我知道大多数这些问题已经在Python 3中得到解决,但我希望支持Python <= 2.7。


3
http://nedbatchelder.com/text/unipain.html - Robᵩ
Python 2 支持 Unicode 的方式与 Python 3 大致相同;使用 io.open()(或 from future_builtins import open)来使用与 Python 3 相同的文件 I/O。在输入时解码和输出时编码,就像在 Python 3 中一样,在其他地方将文本视为 Unicode。 - Martijn Pieters
1个回答

1
我应该在每个字符串前加上u吗?即使它不包含ASCII范围之外的字符?
是的,还要使用支持Unicode的编辑器,并在每个文件顶部声明编码类型。一般来说,您的模式应该是:读取字节,内部使用Unicode,输出字节。
处理sqlite3时,参数化查询会自动将Unicode编码为UTF-8吗,还是需要手动完成?
最好保险起见,但总的来说,我建议您自己测试一下。
当处理“字节串”时,这应该保留为字符串对象还是解码为Unicode字符串?(我认为在大多数情况下会引发异常)
是的,内部使用Unicode。如果您确实知道编码,则不会引发异常。您应该知道编码。确保您知道编码。
如果出于任何原因我需要在代码中使用文字Unicode字符,我可以只需在字符串中使用该字符,只要它是一个Unicode字符串并且我已经在文件顶部声明了我的编码吗?
是的,只要您的编辑器支持Unicode即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接