本来是修改自己一个终端小程序嘚宽字符编码处理然后就和编码纠结上了。
这两天花了不少时间继续研究了下这块越研究越让人迷糊,还存在不少疑问只能说在研究和总结这块时,我的内心是崩溃的……希望以后不再在这块纠结
F
表示宽字符编码,如 ¥
; W
表示其它的字符编码如中文汉字和符号。具体看
(注:先前以为宽字符编码都是全角字符编码不过发现半角中文逗号也是属于 F,懒得研究这块了)
上面函数返回的是一个 unicode 字符编碼串中所有中文字符编码的个数,因为大部分中文字符编码在 utf-8 下是占三个字节而宽度是两个字符编码,所以减去中文个数就是字节和寬度一样注意这里是用的 unicode 字符编码串,如果在 Python2.x 下使用 str则需要改为 + wide_chars()
。
当然上面还不是很严谨因为没有具体研究哪些字符编码可能不是 3 個字节。 这篇文章里提到了另外一种方案不过目前使用来说,上面的例子已经足够了
然后就是开始字符编码编码的各种风暴了……
对於区域设置,有两个特殊的: C
和 POSIX
比如查看 mac 手册时,因为字符编码集原因呈现的是乱码,这时经常会使用 LANG=C man xxx
意思就是去掉本地化,使用程序自身的语言去呈现当然一般就是英文了。
LC_ALL
用于最高优先级的全局设置一般为空;为空时会寻找相应字段 LC_*
的值,如果这个也没设置就找默认的 LANG
值。
LC_CTYPE
用于字节序列编码的解释即字符编码显示等作用
LC_TIME
时间的显示格式和本地化
在 提到过这个,这里再补充下
这个的作用僦是让 Python 解释器在读文件时,对里面的非 ascii 字符编码做编解码处理
如果设置其它的字符编码集,如 gb2312:
则要求文件的编码是 gb2312否则比如保存为 utf-8 編码,则以 gb2312 编码去读取文件会导致错误
另外就是执行的输出,比如:
需要设置终端编码是 gb2312否则输出是乱码。
如果不改变默认编码为 utf-8則报错:
因为这个字符编码串拼接的实际效果是:
fileencoding
:字符编码串。新建文件写文件时的字符编码编码如果没设置则和 encoding
一样,否则在写文件时会做转码;读取文件时会被 fileencodings
设置。
fileencodings
:列表当准备编辑一个已存在的文件时,vim 尝试使用第一个字符编码编码去读取文件如果出错則使用第二个。
所以在打开或保存时可以看到 converted
的标记
另外有个疑问 TODO:
这块目前还不清楚原因,只能猜测是因为终端字符编码集和 encoding buffer 这块有關虽然设置的 gb2312,但是实际是终端的 utf-8但是因为和 fileencoding 一样设置的 gb2312,所以不做转码