关于python代码的多语言问题?

时间:2013-12-18 03:43:35

标签: python multilingual

说我有以下代码 -

homeDir = os.path.expanduser("~")
fullPath = homeDir + "/.config"
print fullPath

这个代码是否仍能正常运行,例如日本,谁的主目录由汉字组成?

我担心的是python不知道如何将两种语言一起添加,甚至不知道如何处理外来字符。

2 个答案:

答案 0 :(得分:3)

问题代码中的所有字符串都是字节串(字节序列)。它们可以表示任何内容,包括以某种字符编码编码的文本。

homeDir = os.path.expanduser("~") # input bytestring, returns bytestring
fullPath = homeDir + "/.config" # add 2 bytestrings 
print fullPath

print有效,但如果它使用不同的字符编码,您可能会在控制台中看到垃圾。否则,代码将适用于任何语言,外国字符。


在Python 3上或使用from __future__ import unicode_literals时,字符串文字是Unicode。在这种情况下,它也应该有效:

from __future__ import unicode_literals

homeDir = os.path.expanduser("~") # input Unicode, returns Unicode
fullPath = homeDir + "/.config" # add 2 Unicode strings
print(fullPath) # print Unicode

打印可能会失败(在这种情况下尝试设置适当的PYTHONIOENCODING

在POSIX系统上,路径可能包含任意字节序列(零字节除外),包括那些无法使用文件系统编码解码的字节序列。来自Python 3 docs

  

在Python中,文件名,命令行参数和环境   变量使用字符串类型表示。在某些系统上,   在传递之前,必须在字节之间解码这些字符串   他们到操作系统。 Python使用文件系统编码   执行此转换(请参阅sys.getfilesystemencoding())。

     

在3.1版中更改:在某些系统上,使用该文件进行转换   系统编码可能会失败。在这种情况下,Python使用   surrogateescape编码错误处理程序,表示不可解码   在解码时,字节被Unicode字符U + DCxx替换   这些在编码时再次转换为原始字节。

这意味着如果原始包含不可解码的字节,fullPath可能包含U+DCxx代理,即使终端使用兼容的字符编码,print(fullPath)也可能失败。如果需要,os.fsencode(fullPath)可以返回原始字节。

答案 1 :(得分:2)

我建议在unicode上阅读this presentation并在python中编码以了解可能发生的情况,以及如何解决它。