说我有以下代码 -
homeDir = os.path.expanduser("~")
fullPath = homeDir + "/.config"
print fullPath
这个代码是否仍能正常运行,例如日本,谁的主目录由汉字组成?
我担心的是python不知道如何将两种语言一起添加,甚至不知道如何处理外来字符。
答案 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中编码以了解可能发生的情况,以及如何解决它。