在进行TCP网络编程的时候,如果字符编码不处理好,很可能会出现中文乱码的情况。
-
全部乱码:编码解码格式不同
这样会出现全部乱码,这个还是比较好查的。
-
部分乱码:TCP接收端分包问题
因为TCP Receive的方法,只能接收byte数组,然后是定长的,比如2048,4096的长度为一个包进行接收。
所以很可能2048个byte正好截取到一个中文字符的一般(我们知道绝大部分中文一般占两个byte)
对于第二种情况,因为这主要是因为英文字母和标点符号是一个byte,所以会出现这个问题。
最好的解决方法就是,让编码等宽。也就是传说中的Unicode
| Unicode编码格式 | 长度 |
|---|---|
| utf8 | 英文字符占1个字节,汉字占3个字节 |
| utf16 | 中文英文都占2个字节,对于个别特殊情况可能会超过2个字节 |
| utf32 | 中文英文都占4个字节 |
我们可以看到,一般情况下其实utf16已经够了,而且比较省空间。
严格的情况下,比如已知可能需要传输一些特殊字符或者生僻字,那就要用utf32了。但是相对会牺牲很多空间。