一文彻底搞懂计算机中文编码

我们很多时候都会遇见中文乱码的问题,很多初入行的朋友会觉得无所适从,今天趁假期前这点闲暇时间,做个整理,希望能帮助一些朋友能搞明白计算机编码的问题。为了能让大家更清楚直观的了解这个事情,我就拿我们的国标GB2312来说下这个编码的事情。

在GB2312-80标准中对于编码的说明如下:
一文彻底搞懂计算机中文编码_第1张图片
其实我们如果把这个图形字符代码表看成一个平面坐标即可,每一个图形字符都是这个平面上的一个点,这个点其实就叫“区位码”,如下图所示:

我们知道计算机汉字有区位码、交换码和机内码之分,我们在上图中就可以看到某个具体图形字符的区位码,以“爸”字举例,区位码就是16-54,这个时候需要知道一个公式,区位码、交换码和机内码的转换关系。
一文彻底搞懂计算机中文编码_第2张图片
转换公式:
首先区位码(二进制)+32=交换码,然后交换码高位变1=机内码
我们可以用“爸”这个汉字举例,转换一下,过程如下:
1、区位码(十进制) =16-54,
2、区位码(二进制) =00010000-00110110
3、交换码(+32) +00100000 00100000
4、交换码(二进制) =00110000 01010110
5、机内码(高位变1) =10110000 11010110
6、机内码(十六进制)=b0 d6

最后我们得到“爸”中文的机内码是“b0 d6”,使用程序验证一下,代码如下:

public class GBKTest {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String nh = "爸";

        byte[] bs = nh.getBytes("gbk");
        for (int i=0;i<bs.length;i++) {
            int n = bs[i];
            if (n < 0)
                n += 256;
            int d1 = n / 16;
            int d2 = n % 16;
            System.out.println(hexDigits[d1] + " " + hexDigits[d2]);
        }

    }

    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}

运行结果如下:
在这里插入图片描述
GB2312请查阅:国家标准化委员会网站,在首页右下侧有个“国家标准全文公开”,选择推荐性国家标准,搜索2312即可找到,封面如下图:
一文彻底搞懂计算机中文编码_第3张图片

你可能感兴趣的:(操作系统,中文编码)