标签归档:字符编码

多平台兼容时字符编码问题

我把自己在 Win 下写的 Python 程序拿到 Linux 下运行,遇到了一些问题。

第一个问题是汉字乱码问题。问题出现在 Win 下汉字的默认字符编码格式是 ANSI 格式,而 Linux 下默认使用 UTF-8 格式。如果你用的是 Ubuntu, 可以看看这篇文章:Gedit中文乱码。如果你想让你的程序能在多平台下正常运行,最好在编写程序时使用通用的 UTF-8 格式编码,或者在你的代码中不要出现除了 ASCII 码之外的字符。

第二个问题:在 Linux 的脚本程序第一行中写类似于下面的代码:

#!/usr/bin/python

可以指定运行脚本的程序,从而可以直接运行脚本文件。但是我的程序并没有直接运行成功,shell 提示找不到解释器文件。只能以类似如下命令方式运行:

python test.py

也就是说第一行代码没有起作用。

猜测出现这个问题是因为 Win 和 Linux 下文本换行符格式不一样。在 Linux/UNIX 下,换行符为 ‘n’, 而 Win 下为 ‘rn’, Mac 下为 ‘r’, 所以 shell 在运行文件时,’/usr/bin/python’ 后多出了一个字符 ‘r’, shell 按照这个文件名当然找不到。解决办法:在编写代码时以 UNIX 格式新建文件,使用 notepad++ 文本编辑器可以很容易做到这一点。

但在我使用了 UNIX 格式新建文件和 UTF-8 文本编码格式保存后程序还是无法直接运行。我试着以UTF-8 无 BOM 格式编码后问题得到解决。查找了资料,了解到:BOM (Byte-Order Mark),字节顺序记号,中文也叫字节顺序记号。对于 UTF-16 和 UTF-32,BOM 的作用是在文件开头加上三个字节来标识文件的字节序,即采用的是大端法还是小端法。但对 UTF-8 来说,没有字节序的问题,BOM 的作用只是来标识这是一个 UTF-8 编码的文本文件。在 UTF-8 中,BOM 在文件开头占三个字节为 EF BB BF (十六进制)。在类 UNIX 系统中,UTF-8 BOM 这种作法则不被建议采用。但是在windows系统中,它是默认存在的。UTF-8 BOM 可以在不知不觉间导致一系列莫名其妙的问题。

总结一下

如果你想让你的代码不但能在 Win 下,也能在 Linxu 下都正常运行(其他平台没有测试),那么最好以 UNIX 格式新建文件,使用 UtF-8 无 BOM 格式编码。Win 下推荐使用 notepad++ 文本编辑器

扩展阅读

字符编码笔记:ASCII,Unicode和UTF-8 —— 阮一峰

UTF-8文件的Unicode签名BOM(Byte Order Mark)问题