博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FileReader读取文件编码丢失问题(乱码)
阅读量:6653 次
发布时间:2019-06-25

本文共 793 字,大约阅读时间需要 2 分钟。

hot3.png

模板管理中,有一个功能,查看模板文件源码,并且修改源码的功能。

读取一个UTF-8编码格式的文件,代码中起初用读取到一个字符串,然后转换字符集,结果就出问题了:

文件读入时是按OS的默认字符集即GBK解码的,我先用默认字符集GBK编码str.getBytes(“GBK”),此时应该还原为文件中的字节序列了,

然后再按UTF-8解码,生成的字符串按理说应该就应该是正确的。

为什么结果中还是有部分乱码呢?

问题出在读取文件的过程中,继承了,但并没有实现父类中带字符集参数的构造函数,

所以只能按系统默认的字符集来解码,然后在UTF-8 -> GBK -> UTF-8的过程中编码出现损失,造成结果不能还原最初的字符。

如何解决呢?

首先,我不管源文件是采用什么编码,取得文件流,然后用org.apache.commons.io.IOUtils.toByteArray这个工具类中的API

 stream = new (targetFile);

byte[] bytes = IOUtils.toByteArray(stream);

这样,就将文件流转化成字节数组,并且不丢失字节;然后,每个文件都有一段头信息,描述文件的字符编码,文件大小等等的信息,同一类字符编码的文件,

头几个字节是相同的,可以以此来判断文件的字符编码类型例如:UTF-8的文件,头2个字节,分别是‘-17’和‘-69’,;接着可以用String的带字符集的构造函数,

把文件还原出来。

另外,clps中不单需要读取源代码,还需要修改源代码,这时候,一定要保证编码格式的一致性,我采用的方式,模仿了文件的格式,返回给页面的

是一个文件对象,包含了文件内容实体,字符编码格式等信息,这样保存的时候,就可以得到这些信息。

转载于:https://my.oschina.net/zhigangsuper/blog/37131

你可能感兴趣的文章
全面剖析Cocos2d游戏触摸机制 (下)
查看>>
Android 检测网络连接状态(转)
查看>>
Javascript的转义Escape
查看>>
C++结构体中的静态变量
查看>>
JSON.parse()和JSON.stringify()
查看>>
mysql 查排名
查看>>
中国最大的融资平台
查看>>
OO第二单元作业小结
查看>>
[华为机试练习题]37.合唱队
查看>>
犯错了~
查看>>
[PHP] 最简单的权限控制设计
查看>>
在虚拟机和主机之间共享文件夹
查看>>
用户场景描述
查看>>
JSAP107
查看>>
cocos2d-x学习笔记12:如何将win32移植到iOS
查看>>
你们可能都小看了Windows!
查看>>
linux下mrtg,cacti,nagios,ganglia的搭建和win/linux主机等的监控。
查看>>
写在网管员世界杂志更名之际
查看>>
用开源工具Xplico助力网络应用层数据解码
查看>>
如何优化cocos2d程序的内存使用和程序大小
查看>>