【字符集】”锟斤拷”是怎么来的

【字符集】”锟斤拷”是怎么来的

在开发过程中,“考铁棍”是每一个程序员不可避免遇到的东西。每次遇到这个东西都很头疼, 不知道这个东西是怎么来的。今天有一次被这个东西恶心到了,决定彻底的研究一下。

首先,从 字符集开始:ASCII、GBK、UTF-8,

然后,从码表:

Base64 码表

首先搞清楚,ASCII 怎么向 BASE64 编码转换:

String s = "中";  // UTF-8
		
byte[] bs_g = s.getBytes("gbk");
byte[] bs_g0 = encoder.encode(bs_g);
		
System.out.println(Arrays.toString(bs_g));  // 中 在 gbk中编码为 [-42, -48]
System.out.println(Arrays.toString(bs_g0)); // Base64编码之后[49, 116, 65, 61]

中: 在GBK码表的值为 D6D0 (二进制)

使用 Base64 编码,将所有的要传输二进制按照 6个比特的形式转换为 Base64中的字符串,Base64 字符串 在任何硬件中都是统一的字符,所以在传输过程中,没有歧义,最后在接收端仍然可以完整的接收到 传输的 Base64 字符串。

如果使用 ASCII 字符,ASCII 字符有 128个字符 ,0-31位 为控制字符,不可显示,在传输的过程中,容易出现异常情况。所以,使用Base64 比较稳妥。

使用Base64 其实增加了传输的成本,本来的内容 从原来的长度变成了 4/3 ,通过前端补 0 的方式,将字符转换为 Base64 的标识长度,避免了传输过程发生异常。

中文在HTTP Header中的处理:

通过String.getBytes(String decode)方法来得到byte[]时,一定要确定decode的编码表中确实存在String表示的码值,这样得到的byte[]数组才能正确被还原。

有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码),可能会通过将中文字符按照字节方式来编码的情况,如:

String s_iso88591 = new String("中".getBytes("UTF-8"),"ISO8859-1");

这样得到的s_iso8859-1字符串实际是三个在 ISO8859-1中的字符,在将这些字符传递到目的地后

程序再通过相反的方式

String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8");

得到正确的中文汉字“中”。这样就既保证了遵守协议规定、也支持中文。

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments