RandomAccessFile类的readLine方法对文本文件中文字符读取显示乱码的问题及解决方法的深入分析
采用readLine方法对txt文本读取中文字符显示乱码,尽管很快找到解决方案,但疑惑反而更多。
1.问题
RandomAccessFile ran=new RandomAccessFile("D:/test.txt","r");
System.out.println(ran.readLine());
当直接用readLine方法对txt文件里的中文字符读取时,显示出来的是乱码。
2.解决方案
经过查找,网上的解决方案是
System.out.println(new String(ran.readLine().getBytes("iso-8859-1"),"gbk"));
2.1.简单介绍下字符集(可跳过)
1、 ISO-8859-1
又称为西欧语言,在ascll码的基础上增加了96个字符和符号,单字节编码,无法表示中文。
2、GB2312/GBK/GB18030
GB2312:我国国家标准简体中文字符集,双字节编码。
GBK:汉字内码扩展规范,不属于国家标准,但囊括范围更广,兼容GB2312。
GB18030:国家标准,在GBK基础上再增加内容。(好像少见)
3、Unicode
计算机科学领域的业界标准,对世界上大部分的文字系统进行了整理、编码。
4、utf-8/utf-16
都是一种针对Unicode的可变长度字符编码。区别在于:
utf-8:对字符采用1到4字节编码。中文是3个字节。
utf-16:对大部分字符采用2字节编码,极少部分采用4字节编码。
2.2.接着解决方案
System.out.println(new String(ran.readLine().getBytes("iso-8859-1"),"gbk"));
解决方案的意思是:
(提下编码解码的概念:编码:把字符转换成字节。解码:把字节转换成字符。)
将readLine读取出来的字符串通过getBytes方法按iso-8859-1编码成字节数组,然后再将字节数组按gbk解码,最后转换成字符串输出。
[2022.9.16更新]删除一些多余的解释,主要的原因在readLine()源码里。
2.3.readLine()源码
public final String readLine() throws IOException {StringBuffer input = new StringBuffer();int c = -1;boolean eol = false;while (!eol) {switch (c = read()) { //read():每次读取一个字节case -1:case '\n':eol = true;break;case '\r':eol = true;long cur = getFilePointer();if ((read()) != '\n') {seek(cur);}break;default:// 重点就这一句input.append((char)c);break;}}if ((c == -1) && (input.length() == 0)) {return null;}return input.toString();}
[2022.9.16更新]重写了对源码的解析,以前研究的不够透彻。
- readLine方法通过read()方法读取文本文件里存储的字节。
- 然后将int型的字节数据转换成char型,重点在这里。
char类型用2个字节的Unicode值表示一个字符,读取到的GBK编码单字节被添加了一个全零的字节组成了Unicode值。
而iso-8859-1是单字节编码,对这个Unicode值进行iso-8859-1编码将会去掉前面补充的零,得到原来GBK编码的字节,这时再用GBK解码即可得到原来的字符。
举个例子——
- "你"字对应的GBK编码是0xC4E3(0x表示十六进制)
- read()方法读取到两个int类型的字节0xC4和0xE3,转变成char型:0x00C4,0x00E3
- 如果直接输出,编译器会直接查找/计算0x00C4这个Unicode值对应的字符,很显然会输出乱码。
- 采用iso-8859-1编码后:0xC4,0xE3
- 采用GBK解码成Unicode值:0x4F60,为什么不是解码成字符?因为char或String类型存储的就是Unicode值,经过查找或计算就能得到相应的字符。
- 如果不采用iso-8859-1编码直接GBK解码会怎么样?编译器将会对0x00C4,0x00E3进行GBK解码,因为GBK编码解码是两个字节对应一个字符的,所以会得到两个字符,这种情况也会导致乱码。
因为在写另一份更加详细的java字节流读取博客,所以对这篇博客的修改很粗糙,可能你看完有点点感觉但好像又没完全弄懂,可以看下这篇——Java字节流读取中文文本编码解码详解
RandomAccessFile类的readLine方法对文本文件中文字符读取显示乱码的问题及解决方法的深入分析相关推荐
- linux安装 中文乱码怎么解决方法,Linux安装GBK/GB2312程序显示乱码的五种解决方法...
不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,接下来是小编为大家收集的Linux安装GBK/GB2312 ...
- linux服务器程序乱码,Linux安装GBK/GB2312程序显示乱码的五种解决方法
不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,下面小编就给大家介绍下Linux安装GBK或GB2312程 ...
- Linux安装gbk字体,Linux安装GBK/GB2312程序显示乱码的五种解决方法 - 软件教程网
不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,下面小编就给大家介绍下Linux安装GBK或GB2312程 ...
- Hive,Hbase shell 中文变问号(??) 的解决方法
Hive,Hbase shell 中文变问号(??) 的解决方法 参考文章: (1)Hive,Hbase shell 中文变问号(??) 的解决方法 (2)https://www.cnblogs.co ...
- myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法)
myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法) 参考文章: (1)myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法) (2)https://www. ...
- manjaro中文输入法已安装但切换不了解决方法
manjaro中文输入法已安装但切换不了解决方法 参考文章: (1)manjaro中文输入法已安装但切换不了解决方法 (2)https://www.cnblogs.com/kunx/p/9143959 ...
- ajax注解解决中文乱码,基于注解的简单MVC框架的实现,以及jquery,prototype,ajax传输乱码问题的一点解决方法...
1:基于注解的简单MVC框架的实现 效果:1:用户只需要定义一些普通的java类来做为M层,也就是STRUTS的action类,该类里包含1到 N个控制方法,每个方法需要的form数据,由注解@Act ...
- php 日文中文乱码,phpgd库中文乱码的产生与解决方法详解 || mao的博客
在php jpgraph安装教程之验证php环境是否支持jpgraph安装方法的php教程中我提到了gd库的验证,对于jpgraph中文使用者来说使用 jpgraph时不产生中文乱码是非常必要的,而g ...
- VScode 中文显示出现黄色方框的解决方法
VScode 中文显示出现黄色方框的解决方法 使用 VScode 打开源码时,发现注释中的汉字都被一个黄色的方框圈住了,这是因为使能了批注中字符的突出显示的功能,不喜欢这个黄色方框的小伙伴,可以参照下 ...
- mysql5.7 解压版 中文乱码_MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法...
1. 解压版的安装 (1). 下载压缩包并解压到一个磁盘位置 压缩包下载链接:https://dev.mysql.com/downloads/mysql/ 压缩包内容: (2). 写配置文件 复制my ...
最新文章
- 2022-2028年中国香薰行业市场研究及前瞻分析报告
- linux deploy 版本,Linux Deploy
- 被乔布斯遗忘的VR:纽约大学教授解密苹果与虚拟现实的尘封往事
- SQL重复记录查询(转载)
- 透过性别看世界_透过树林看森林
- 哈工大|NLP数据增强方法?我有15种
- sed文本数据流处理命令
- shell 截取ip地址最后一位_shell 截取IP地址
- 修改ECSHOP后台的商品列表里显示该商品品牌
- 一个简单的Blob存取例子
- Ubuntu 16.04 用apt-get来安装Java
- android使用Dialog实现复选功能与数据库结合综合实例
- 深度学习TF—7.卷积神经网络CNN
- NHibernate中Example类使用注意事项
- python写图片爬取软件_python抓取整个网站图片
- FMEA软件框图及接口功能库(FMEAHunter)
- MIT线性代数笔记六 列空间和零空间
- 网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、RSS、VXLAN
- 个人六年的成长与工作经验分享
- Kafka 安装、使用