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

news/2024/7/3 12:57:59 标签: unicode, java, 乱码, GBK, UNICODE

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文件中避免乱码的做法:

java">//法一:将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文本文件编码


http://www.niftyadmin.cn/n/1223802.html

相关文章

路由协议讨论

我也正在学,大家有什么不明白的,就一起来讨论讨论... 只讨论协议,不讨论配置....转载于:https://blog.51cto.com/ylyqd/1786

系统运维系列 之java中连接oracle数据库并进行数据读写

1 前言 由于oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库。这是在Maven项目中连接不同类型数据库的本质区别,一般连接Mysql或者GP数据库只需要在pom文件中添加依赖即可&a…

【原创】网页中图片等比例缩放(完美无错版)

<SCRIPT LANGUAGE"JavaScript"> <!-- var iOriginalWidth, iOriginalHeight; //存放图片原始长度、宽度 //动态显示图片的长度、宽度和显示比例 function dispCurrentSize() { var zoom document.all.idImg.style.zoom; zoom eval(zoom.substring(0, zoom…

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

1 前言 编程语言&#xff1a;java IDE&#xff1a;Myeclipse 2 常见错误 2.1 Remove ‘override’ annotation解决办法 原因&#xff1a;Java 1.5的编译器默认对父类的方法进行覆盖&#xff0c;采用Override进行说明&#xff1b;但1.6已经扩展到对接口的方法&#xff1b;所以如…

PHP版本繁简体,UTF-8和Unicode互转的函数:GB2312Big5,GB2312UTF-8,Big5UTF-8等

研究VtigerCRM时&#xff0c;试图把繁体语言插件转成简体版&#xff0c;并去除对iconv的依赖&#xff0c;因为很多php空间不支持&#xff1b;研究过GB2312,Big5&#xff0c;UTF-8之间的转化方法。后来就扔到了一边&#xff0c;最近有多个朋友询问解决方案&#xff0c;于是重新找…

作为程序员的一些感想[转]

发信人: thickcoffee (北方的狼), 信区: RSGW标 题: 作为程序员的一些感想发信站: 两全其美网 (Wed Feb 8 10:56:00 2006), 转信(lqqm.net) 看了那篇写程序员的这篇文章&#xff0c;有很多共鸣。我自己学的是自动化&#xff0c;然而&#xff0c;就像我的大多数同学那样&#…

系统运维系列 之maven项目中连接oracle数据库的那些坑(接连接oracle数据库并进行数据读写专题)

1 前言 继续研究maven项目中连接oracle数据库&#xff0c;期间已经遇到了一些问题并已整理在前面的博客中&#xff0c;本文继续补充遇到的问题。 2 问题整理 2.1 maven 出现错误 -source 1.5 中不支持 diamond 运算符 出现如下错误&#xff1a; -source 1.5 中不支持 diamond …

系统运维系列 之IO流概述及其分类(java应用)

1 前言 前面博客中已经介绍了各种编码问题&#xff0c;但是在I/O流传送的过程中&#xff0c;如果弄不清楚各种I/O流的异同&#xff0c;往往也会出现乱码的情况&#xff0c;在http(s)、socket、telnet等应用的过程中都要注意此类问题。以下为倾心整理的I/O流介绍&#xff0c;全是…