2013-12-18 24 views
4

说我有以下代码 -多语言关注python代码?

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

请问这代码仍然正常工作的人在说,日本,谁的主目录是由汉字的?

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

+2

你可能想'os.path.join'而不是'+',虽然这不是你的问题的答案。 – user2357112

+1

非常有趣但很好,它应该工作。你为什么不尝试一下呢? – aIKid

+3

外语也只是零和一个。所以是的,通常它会起作用。不过,了解Unicode。 –

回答

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)可以在需要时返回原始字节。

+0

-1由于python3字符串文字是fullblown unicode字符串,而不是字节串。 – Basilevs

+2

@Basilevs:OP使用Python 2(查看'print'语句)。它是Python 3中的一个函数。顺便说一句,感谢您留下评论,而不是由于误解或无知而导致的沉默downvote。 – jfs

+0

谢谢您的回复,垃圾被打印出来并不太重要。所以看起来我应该没问题。 –

2

我会推荐阅读this presentation关于unicode和python编码来了解可能发生什么,以及如何解决它。