`
mypyg
  • 浏览: 545310 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于使用InputStreamReader读取GBK编码文件乱码的问题

阅读更多
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(packageFilePath)));

当使用此Reader读取GBK编码的文件时,所有的中文都会乱码,因为Reader会将读取到的byte转换成char,如果没有指定转换编码,那么Android默认是使用的utf8,那么读取到的内容就会错误。

那么假如读取完毕后进行一次转码是否可以解决乱码问题呢?
比如:
String s = readline();
s = new String(s.getBytes("gbk"), "gbk");

思路是获得字符串的gbk编码,按照gbk编码重新解析一遍,实验证明是不可以的,是什么原因呢?

举例说明:
byte ge[] = {(byte)0xb8, (byte)0xf6};

这是汉字‘个’的gbk编码。
String s = new String(ge, "gbk");
此时s不会是乱码。
s.getBytes("utf8") //得到-28,-72,-86。‘个’的utf8编码
s.getBytes("gbk") //得到0xb8,0xf6。‘个’的gbk编码

而如果用一下代码生成s:
String s = new String(ge, "utf8");

此时s已经是乱码。
s.getBytes("utf8") //得到-17,-65,-67,-17,-65,-67

此时s的内容已经完全乱掉了,所以再用
s.getBytes("gbk");

得到的数据也是乱的,无法逆向出真正的内容来。

所以要解决这个问题只能是让reader将byte转向char时使用正确的编码,即生成Reader时指定编码,即:
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(packageFilePath), "gbk"));

0
1
分享到:
评论
1 楼 文艺吧网 2017-05-16  
还有一个GZIP的问题,我怎么转都乱码最后是因为要解压一下http://www.sojson.com/blog/227.html

相关推荐

    Android读取本地json文件的方法(解决显示乱码问题)

    本文实例讲述了Android读取本地json文件的方法。分享给大家供大家参考,具体如下: 1、读取本地JSON ,但是显示汉字乱码 public static String readLocalJson(Context context, String fileName){ String json...

    Java文件读写操作函数实现

    如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。 * * 构造方法: * * InputStreamReader isr = new InputStreamReader(InputStream * in);//构造一个默认编码集的InputStreamReader类 ...

    java 逐行读取txt文本如何解决中文乱码

    java读取txt文本中如含有中文,可能会出现乱码,解决方案是: 1.要统一编码,java工程的编码,txt文本编码,java工程中的java文本编码都统一为utf-8; 2.利用 InputStreamReader(new FileInputStream(fileUrl), ...

    Java使用字符流拷贝文件出现乱码

    Java代码   // BufferedReader in = null; // BufferedWriter out = null;... Reader in = null;... // in = new BufferedReader(new InputStreamReader(new FileInputStream(sr

    文件内容读取类

    //构造一个BufferedReader类来读取文件 String s; while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行 wordList.add(s.trim()); } } catch (Exception e) { Logger.getLogger(FileUtil....

    java 文件读写功能

    以字节为单位读取文件、以字符为单位读取文件、以行为单位读取文件、随机读取文件内容、显示输入流中还剩的字节数、追加文件 FileInputStream、AppendToFile、 RandomAccessFile 、InputStreamReader

    BZip2文件读取

    读取BZip2文件的jar包 new InputStreamReader(new BZip2CompressorInputStream(new BufferedInputStream(new FileInputStream(file)),true));

    编写程序,使用两个线程,一个队列,其中一个线程从键盘读取数据,放入到队列中,直到读取的数据是字符串quit则结束

    1. 编写程序,使用两个线程,一个队列, 其中一个线程从键盘读取数据,放入到...要求:(a) 必须使用System.in,InputStreamReader, BufferedReader,Thread, (b) 必须使用java.util.concurrent.LinkedBlockingQueue.

    Android中文件读写(输入流和输出流)操作小结

    1. Android中文件读写的原理: (1).所有文件的储存都是字节的储存。 (2).在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。 (3).在读取文件(特别是文本文件)时,也是一个字节一个...

    day019-io笔记和代码.rar

    * InputStreamReader:将字节输入流包装一下,让其更适合读取文本文件 * 构造方法: * 1.InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。 * 2.InputStreamReader...

    java解析txt

    * 功能:Java读取txt文件的内容 * 步骤:1:先获得文件句柄 * 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取 * 3:读取到输入流后,需要读取生成字节流 * 4:一行一行的输出。readline...

    Java文件处理工具类--FileUtil

    * 读取文件并返回为给定字符集的字符串. * @param fileName * @param encoding * @return * @throws Exception */ public static String readFileAsString(String fileName, String encoding) throws ...

    高阶JAVA篇-深入解读字符集.pptx.pptx

    Java字符编码基础 Java字符编码是处理文本信息的基础,它规定了...Java提供了丰富的API用于字符编码的处理,如Charset类可以获取系统默认的字符编码,InputStreamReader和OutputStreamWriter可以进行字符编码的转换。

    java调用io流

    java调用io流,InputStreamReader,BufferReader读取文件

    InputStreamReader和BufferedReader用法及实例讲解

    主要介绍了InputStreamReader和BufferedReader用法及实例讲解的相关资料,需要的朋友可以参考下

    java 文件存储 Inputstream outputstream reader writer的用法

    当你还是一个java初学者的时候,是不是还在为你没有一个好的源代码模仿去学习而烦恼,这个代码很容易看懂,对你学习很有帮助

    java生成properties文件工具类

    通过程序生成properties文件的工具类,并可根据添加顺序生成,可添加注释,调用步骤如下: 1.OutputOrderProperties p = new OutputOrderProperties(); 2.FileInputStream fs = new FileInputStream("文件路径"); 3....

    Java之IO流学习总结

    File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。 9....

    Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理

    本文通过示例代码给大家解析了Java中的InputStreamReader和OutputStreamWriter知识,需要的的朋友参考下吧

    android在线词典源码

    * 面向字符会产生乱码问题, 此时需要采用 InputStreamReader去改写字符 * 为了不造成问题的复杂, 这里不做研究, 采用系统默认编码[GB2312], 仅仅写了一个处理乱码的函数 * getStringFromFile(String filePath, ...

Global site tag (gtag.js) - Google Analytics