Middle Earth

python and chinese

最近用 wxPython 写了个需要在 Windows 下运行的小程序。简单记录下中文问题。

1.

在 Linux 上,在源文件开头声明 utf-8,一般就没有什么问题了,可以随意操纵中文字符串,跟普通 str 一样。

但是在 Windows 上,即使已经声明,还是会有编码错误。(貌似还是会用系统默认的 gbk 或者 ascii 编码?)

所以,多平台的程序为了保险,还是要把含中文的字符串写成 u”“。

2.

我用了 XRC 来画界面。如果要在 XRC 里边直接写中文的话(而不是用 i18n 机制),可以把 XRC 文件声明为 utf-8 (在 xrced 里不选中任何控件,就能看到选编码的下拉框了)。
<?xml version="1.0" encoding="UTF-8"?>
3.

从操作系统上读取东西的时候,比如文件的读取,或者 os.getcwd(),这些函数返回的一般都是 str,如果其中可能包含中文,需要解码成 unicode 字符串。(Linux 一般不需要)。(getcwd 还有个版本,os.getcwdu(),返回的是 unicode)。

用什么编码进行 decode,要看数据原本是以什么编码保存的。我有一个配置文件,

写入用,
if type(v) is unicode:
v = v.encode("utf-8")
f.write("%s: %s\n" %(k, v))
读取用,
k, v = line.strip().split(": ", 1)
k = str(k)
v = v.decode("utf-8")
但是如果是以系统默认编码保存的,可以用 sys.getfilesystemencoding() 获知系统编码。

4.

我还用了 sqlalchemy 和 sqlite。如果路径中含有中文,传给 create_engine 的数据库文件名也要用 unicode 类型,即使这个参数本身根本不含有中文字符:
engine = create_engine(u"sqlite:///x.db")
当然,这个问题也是只在 Windows 上才有。

5.

Linux 上,系统也用 utf-8,所以跟程序里一致,能省很多心。而 Windows 上就需要更仔细点了。

Comments