3

在 python <= 2.7 中编写 unicode 程序的一般指导方针是什么?即使它不包含 ASCII 范围之外的任何字符,在每个字符串前面加上 u 是否也是一种好习惯?

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

在处理“字符串”字节时,应该将其保留为字符串对象还是解码为 un​​icode 字符串?(我相信这在大多数情况下会抛出异常)

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

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

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。

4

1 回答 1

1

即使它不包含 ASCII 范围之外的任何字符,在每个字符串前面加上 u 是否也是一种好习惯?

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

一般来说,您的模式应该是:读取字节,在内部使用 unicode,输出字节。

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

安全总比后悔好,但总的来说,我建议您自己测试一下。

在处理“字符串”字节时,应该将其保留为字符串对象还是解码为 un​​icode 字符串?(我相信这在大多数情况下会抛出异常)

是的,在内部使用 unicode。不,如果您确实知道编码,这不会引发异常。你应该知道编码。确保您知道编码。

如果出于某种原因我需要在代码中使用文字 unicode 字符,我是否可以在字符串中使用该字符,只要它是 unicode 字符串并且我在文件顶部声明了我的编码?

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

于 2013-08-27T21:03:33.253 回答