系统运维系列 之编程中UTF-8GBK和GB2312等编码格式之间的区别和联系

Posted 琅晓琳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统运维系列 之编程中UTF-8GBK和GB2312等编码格式之间的区别和联系相关的知识,希望对你有一定的参考价值。

1 简介
1.1 ANSI 即“Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码):用同样的ASCII方案来保存英文文字;
1.2 GB2312:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样就组合出大约7000多个简体汉字,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符。GB2312 是对 ASCII 的中文扩展;
1.3 GBK 编码: GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码;
1.4 UNICODE:ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于 ascii 里的那些”半角”字符,UNICODE 包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。UTF对应UNICODE在网络上的传输问题,UTF8 就是每次8个位传输数据,而 UTF16 就是每次16个位,只不过为了传输时的可靠性,从UNICODE到 UTF时并不是直接的对应,而是要过一些算法和规则来转换。

2 要点
2.1 GBK、GB2312等与UTF8之间的相互转换:
通过Unicode编码相互转换:
GBK、GB2312—>Unicode—>UTF8
UTF8—>Unicode—>GBK、GB2312
2.2 记事本中保存格式的区别
记事本中另存为可保存格式如下:
在这里插入图片描述
Windows下,文本文件有五种编码:ANSI、UTF16BE、UTF16LE、UTF-8有BOM、UTF-8无BOM(仅读取时支持该编码):
记事本里的ANSI编码,对于简体中文操作系统而言,就是GBK编码;
UTF16LE编码是16位(2字节)的Unicode编码,LE表示little endian,即低位字节在前,高位字节在后;
UTF16BE编码是16位(2字节)的Unicode编码,BE表示big endian,即高位字节在前,低位字节在后;
UTF-8编码分为UTF-8和带有BOM的UTF-8,BOM是Byte Order Mark的缩写,它用来指明编码,BOM可以用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符("\\uFEFF"),位于文本文件头部。如:

BOM编码
FE FFUTF16BE
FF FEUTF16LE
EF BB BFUTF-8

3 应用
3.1 使用Java语言做流写入csv文件中避免乱码的做法:

//法一:将UTF-8编码修改为gbk【效果很好】
fileOutputStream = new FileOutputStream(path,true);
bufferedWriter  = new BufferedWriter(new OutputStreamWriter(fileOutputStream, "gbk"));

//法二:加入BOM标识,标识使用的编码格式为UTF-8【可以试试】
fileOutputStream = new FileOutputStream(path,isAdd);
fileOutputStream.write(0xef);  //加入BOM标识
fileOutputStream.write(0xbb);
fileOutputStream.write(0xbf);
bufferedWriter  = new BufferedWriter(new OutputStreamWriter(fileOutputStream));

3.2 批量修改文件编码可参照以下资料:
https://blog.csdn.net/hanford/article/details/53351153 批量修改文件编码

参考资料:
https://blog.csdn.net/m0_37263637/article/details/80198919 常用编码方式(ASCII Unicode GBK)
https://blog.csdn.net/hxlawf/article/details/89456976 UTF-8 GBK GB2312 之间的区别和关系
https://www.cnblogs.com/hanford/p/6105045.html Windows文本文件编码

以上是关于系统运维系列 之编程中UTF-8GBK和GB2312等编码格式之间的区别和联系的主要内容,如果未能解决你的问题,请参考以下文章

系统运维系列 之java编译运行中常见的几个错误整理

系统运维系列 之HashMap底层实现原理和应用

系统运维系列 之greenplum vacuum清理删除数据命令

系统运维系列 之MySQL部分学习整理1

系统运维系列 之java中需要转义的特殊字符

系统运维系列 之java中需要转义的特殊字符