less的字符集设置与汉字编码范围

我们发现,有时候,用less打开一个文件显示的是乱码,而有时候,是正常的。
有两个关键性的环境变量与此有关
LESSCHARSET 和 LESSCHARDEF 。
先解释一下less是怎么解析字符的。
less把字符分为3类。
普通字符(normal characters):可以直接在屏幕上显示
控制字符(control characters):文本文件中的控制字符,不能直接在屏幕上显示,例如回车,换行
二进制字符 (binary characters):除以上之外其它的字符。
为了说明一个字节究竟是属于这三者的哪一类。我们需要用LESSCHARDEF 环境变量来说明。
例如
setenv LESSCHARDEF 8bcccbcc18b95.b
其中,"b"代表binary,"c"代表control,"."代表normal
8bcccbcc18b95.b的含义是:
0x0-0x7是binary characters
0x8 是control character
0x9 是control character
0xA 是control character
0xB 是binary character
0xC 是control character
0xD 是control character
然后下面18个是binary characters,0xE-0x1F
0x20-0x7F,一共95个字符是normal characters
后面的,其他的未知的,统统是binary characters.
我目前用的less的版本是less 381,Copyright (C) 2002 Mark Nudelman。
下面看一张表,是LESSCHARSET和LESSCHARDEF 。
ascii 8bcccbcc18b95.b
dos 8bcccbcc12bc5b95.b.
ebcdic 5bc6bcc7bcc41b.9b7.9b5.b..8b6.10b6.b9.7b
9.8b8.17b3.3b9.7b9.8b8.6b10.b.b.b.
IBM-1047 4cbcbc3b9cbccbccbb4c6bcc5b3cbbc4bc4bccbc
191.b
iso8859 8bcccbcc18b95.33b.
koi8-r 8bcccbcc18b95.b128.
latin1 8bcccbcc18b95.33b.
latin9 8bcccbcc18b95.33b.
next 8bcccbcc18b95.bb125.bb
来看常见的几种编码格式的区别是什么。
ASCII和DOS的区别就是,ascii只是识别到0x7F,而DOS是从0x00-0xFF.还有一个细微的区别就是DOS把0x1A当作了 control character。0x1A在ASCII中是向右的箭头。0x80还是被认作控制字符,但是0x81-0xFF 就是 normal character.
而我们通常用的字符集是latin1,它与ASCII的区别就是把0x80-0xA0的字符定义为了binary,而其他的未知的都定义为了 normal.
而latin1和latin9其实就是iso8859的别名。
最后说GB2312、GBK、GB18030的编码范围。
GB2312属于多字节编码( Multibyte characters ),是ASCII的扩展,与ASCII完全兼容。
ASCII部分,以单字节的方式编码,范围是0x00-0x7F
其余的字符,以双字节编码,范围是0xA1-0xFE。0xA1到0xFE中不仅包括汉字,还包括各种字符,甚至英文字母。这些英文字母通常被称作全角的英文字母,在显示的时候一般会和一个汉字占有同样的宽度。
GBK 向后兼容GB2312。因为GB2312所能表示的汉字太少,而新的国家标准迟迟未制定。所以就有了GBK。GBK主要是把unicode 2.1中的汉字加入了进来。
ASCII部分,以单字节的方式编码,范围是0x00- 0x7F。
其余的字符,以双字节编码,
第一个字节的范围是0x80-0xFE。
第二个字节的范围是0x40-0xFE。
GB18030是中国政府于2000年底颁布的GB2312的替代品。它依旧采用的是变长多字节编码。不过长度可以为1字节,2字节,4字节。 (GB2312和GB18030中是没有4字节编码的)。总共可以表示的字符大概为150万个。
ASCII部分,以单字节的方式编码,范围是0x00- 0x7F。
其余的字符,以双字节或四字节编码,
以双字节编码的字符,
第一个字节的范围是0x81-0xFE。
第二个字节的范围是0x40-0x7E,0x80-0xFE。
注意,GB18030故意避开了0x80,0x7F
共23940个码位。
以四字节编码的字符,
第一个字节的范围是0x81-0xFE。
第二个字节的范围是0x30-0x39(ASCII字符的'0'-'9')
第三个字节的范围是0x81-0xFE。
第四个字节的范围是0x30-0x39(ASCII字符的'0'-'9')
共1587600个码位。
可是对于GB2312、GBK、GB18030, LESSCHARDEF 该怎么写呢?
相烦高人写一个然后提交给less的作者,让他添加到charset.c中即可。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥