向乱码宣战

//

//  向乱码宣战

//  Encoding and Character Set

//

//  Created by ChenJackson on 7/29/16.

//  Copyright © 2016 ChenJackson. All rights reserved.

//


乱码:


    1. 当打开一个文本文件,而它却给你展示外星文字或者火星语法,我们称此种乱象为乱码。
    2. 通常情况下数字不乱码,英文不乱码,所谓的'半角符号'不乱码。
    3. 本地不乱码,复制到远程尤其是服务器(Linux, AIX, HP-ux等)经常出现乱码。


一. 文字(字符)是如何显示的
    a. 计算机是二进制设备,它处理,传输,存储的都是二进制符号( 0 or 1 )。
    Mac OSX:
ChenJacksons-MacBook-Pro:~ jackson$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
ChenJacksons-MacBook-Pro:~ jackson$ echo '话费余额查询' > utf8.txt
ChenJacksons-MacBook-Pro:~ jackson$ more utf8.txt
话费余额查询
ChenJacksons-MacBook-Pro:~ jackson$ xxd utf8.txt
0000000: e8af 9de8 b4b9 e4bd 99e9 a29d e69f a5e8 ................
0000010: afa2 0a ...
ChenJacksons-MacBook-Pro:~ jackson$ iconv -f utf8 -t gbk utf8.txt > gbk.txt
ChenJacksons-MacBook-Pro:~ jackson$ more gbk.txt
?             // 这什么鬼
ChenJacksons-MacBook-Pro:~ jackson$ xxd gbk.txt
0000000: bbb0 b7d1 d3e0 b6ee b2e9 d1af 0a .............
ChenJacksons-MacBook-Pro:~ jackson$ iconv -f gbk -t utf8 gbk.txt
话费余额查询



     PS: 你可以看到虽然文件中的十六进制内容虽然不同,但是去可以通过某种方式显示相同的内容\
             若不通过iconv进行正常的加工,你就看不到正确的内容
    b. 显示器显示文字的过程,可以简单理解为查字典。
        由以上命令,大致已经可以猜到:
            -> 系统读取文件中的二进制内容
            -> 对照编码表,查看相关的字符              // 即当前系统环境默认的编码,这里是utf8 \
                                                                        // 找错字典的结果看到天书
            -> 找到对应的字符后,以系统设置的字体显示在显示器上。
    c. 字典编排方式叫编码「encoding」,包含各种符号的集合叫字符集「character set」,编号就是以上所看到的数字码。
        梳理一下(这可能是个纠错的过程):
            -> 目前有两种字符集:
                ANSI: 美国国家标准学会收集了一堆常用的符号,使用ASCII的方式进行编排。\
                            由于这个编排方式可以覆盖整个字符集,所以就没有产生新编码了。
                Unicode: 仍然是美国人,一个叫Unicode的组织发布的字符集,它疯狂地想吐下人类的几乎所有的符号。
                                这其中当然包括中文,俄文,泰国文等等甚至是古代龟壳上的符号。
            -> 常用的编码有ascii, utf-8, gb2312, gb18030, gbk, utf-16等:
                ascii: 8bit数字序列就表示,2的7次方(首位是0没有用到)为128,每个都用上了。\
                             ASNI也没有打算加更多符号。
                gb2312: 大家都知道汉字是一个字两个字节(16位),65535种情况给所有汉字编上号肯定是没有什么问题的。\
                               而Unicode中有海量符号,这里就没有办法解决了。但是,这并没有关系。因为这是中国为自己\
                               定制的标准,它从A1A0开始使用也就是首位是字母,它兼容ascii。
ChenJacksons-MacBook-Pro:~ jackson$ echo 'a话费余额查询b' | iconv -f utf8 -t gbk| xxd
0000000: 61bb b0b7 d1d3 e0b6 eeb2 e9d1 af62 0a    a............b.

                                61是数字开头所以它是ascii编码,系统把它当ascii处理。
                                bb是字母开头所以往后再取两位,系统使用gbk处理bbb0(话)。
                                0a也是数字开头,按照ascii编码,系统认为它是「行尾」。
                gbk > gb18030 > gb2312: 其实就是把新汉字补充进空位而已,原有编码不变。
                             gb2312中只有简体字,所以你用gbk中的繁体字转码成gb2312时会失败,因为对应位置上没有相应字符。\
                                所以大字符集编码转小字符集编码并不都会失败,只是尽量不要这么做。

                utf-8, utf-16, utf-32: 这不是表示已编排的字符数量。
                            你可以理解为使用不同的规则来表示巨量的字符。
                            比如,你可以用4个字节定长的方式,或者1个字节以上不定长的方式。
                            有兴趣可以自己继续深入研究。

二. 数字,英文,标点不乱码:
    经过以上的解释,相信你已经了解到了:
        a. 不论是ANSI还是Unicode都包含了这些字符。
        b. Unicode为了兼容性,主动接受ANSI的ascii编码,且Unicode自己的编码「多数」字母(数值比较大)开头不会干扰。
        c. 半角和全解是中国gb2312等编码的概念,说白了半角指的就是ascii那部分。所以半角自然不会乱码。

三. 本地没问题,远程就乱码:

    从以上的命令及结果你也可以得到答案:
        a. 相同文字「话费余额查询」不同的编码方式下会产生不同的二进制码(文件内容)。
        b. 相同的二进制码(文件内容)在不同编码环境下可能会有不同的翻译结果。
        c. 另外,有些应用程序会主动定义自己的编码,如虚拟终端CRT, gedit等。\
                 如果他们的默认值不能兼容系统值,你就会看到乱码。然而英文仍然正常。
        d. 还有,你在传输的时候传输的工具可能会犯类似以上错误。
                它需要从你的文件中读出字符,传递字符,再把字符翻译成二进制写入远程的文件。
                某个环节没有处理好,就会在远程出现乱码,甚至不是gbk当utf8来显示这种乱码,
                而是二进制被进行了不可预知的加工,这样就彻底乱了。


战胜乱码:


1. 掌控全局
    a. 当前系统是何编码环境。
    b. 目标系统是何编码环境。
    c. 文件内容是否超出了ANSI(ascii码)。


2. 同与不变
    a. 文本显示过程中编码不匹配会乱码,做好配置确保一致。
    b. 文本传输过程中二进制码会被加工,应打包传输(tar,zip),或者以BIN方式传输(FTP)。
    c. 准备好字体,如果你要显示中文,请确保双方有全覆盖的字体(如CRT所处的环境及服务器)。


3. 变而有道
    a. 若本地为GBK, 目的为UTF8,可事先转换成UTF8再进行不变的传输。
    b. 也可至服务器使用iconv进行转换,前提是你清楚:
            由什么转换成什么且需要转换的信息传输前后没有变。


4. 旁门左道
    a. CRT显示正常,文本体量较小(几百KB),可通过CRT打开vi复制粘贴中文文件内容保存即可。
            此方法,若是遇到几十MB的文本,那这个等待插入vi的时间将足以使你崩溃。
    b. 远程有图形界面,二进制内容未被修改。在无端使用firefox打开文件选择你需要的encoding进行显示。
            然后,复制粘贴。同样,最好是小文件。
    c. 方法B可以使用gedit -encoding gbk(encoding of 话费清单.txt) 话费清单.txt,打开文件。
            复制后粘贴到gedit -encoding utf8(encoding you want) 话费清单2.txt,保存。
            gedit是专业文本处理器,文件大一点应该问题也不大。


打完收功:


    利用你手上一切可利用的工具,消灭困难!如果不行,那就学习新的工具。
    只要你有钻研的精神,并付出努力,你终会发现许多困难经不起持久战!!!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25521690/viewspace-2122738/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25521690/viewspace-2122738/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值