android java 中文乱码_Android第二十三课 Java文件读取中文乱码

这篇博客探讨了在Java中处理中文乱码的问题,特别是在读取UTF-8编码文件时遇到的问题。作者通过示例代码解释了字节流和编码转换的概念,并指出Java读取文件时默认遵循系统编码可能导致的乱码情况。解决方案包括指定正确的编码格式,如在读取UTF-8文件时使用`InputStreamReader`和`BufferedReader`。同时,还提到了UTF-8带BOM头的文件会导致特殊符号的显示问题。
摘要由CSDN通过智能技术生成

1 字节流以及编码转换说明

String str = "中";

byte[] b_gbk =str.getBytes("GBK");

byte[] b_utf8 =str.getBytes("UTF-8");

String s_gbk = newString(b_gbk,"GBK");

String s_utf8 = newString(b_utf8,"UTF-8");

System.out.println(s_gbk);

System.out.println(s_utf8);

环境:Windows系统Eclipse,源码格式是GBK,为什么写明环境,主要还是跟系统显示有关

1.1详细剖析

第一行代码其实暗含:str是一个GBK编码的字符串,里面的byte数组存储的编码字符串是GBK编码的。

第二行代码getBytes是什么意思呢?就是告诉系统,你把str里面的字符串内容,转换成GBK编码然后存储到b_gbk,这就会涉及到GBK编码转换成UTF-8编码,如果理解不了,可以这样子想:中字在GBK里面的编码是这样子这样子,你看看中字在UTF-8的编码是什么,告诉我。

第四行代码后面有指定编码格式,就是告诉系统,我这个String类型存储的是GBK编码的字符串,系统在显示该字符串的时候,知道其编码格式,采用GBK来解码显示。

问题1:

java读取utf-8编码文件,出现中文乱码,最大可能的原因是什么?读取GBK编码文件,是正常的!

上面已经提到过String变量是有编码的格式要求的,默认情况下,读取文件的时候会根据系统的默认编码来读取,这种情况下,肯定就是乱码了,因为读取进去的就是,赋值给String就是GBK编码。

问题2:

utf-8带BOM的文件会出现?这个符号,这是什么情况?

原来BOM在文件中也是一种字符存在,因为没有对应的编码输出,所以只能够显示这种符号了。所以在应用中不要选择这种编码方式就可以了。

2 UTF-8或者GBK文本的读取

有了上面的基础,就可以读取文本了。构建一个UTF-8的中文文档

publicstaticvoidmethod()

{

try{

File  file =newFile("d:fengyuzaitu.txt");

bytebuffer[] =newbyte[20];

FileInputStreamf ileinput =newFileInputStream(file);

fileinput.read(buffer);

Strings =newString(buffer,"UTF-8");

System.out.println(s);

fileinput.close();

}catch(IOException e) {

e.printStackTrace();

}

}

publicstaticvoidmethod1()

{

try{

FileInputStream fileinput =newFileInputStream("d:fengyuzaitu.txt");

InputStreamReader isr =newInputStreamReader(fileinput,"UTF-8");

BufferedReader br =newBufferedReader(isr);

Stringtest ="";

test = br.readLine();

System.out.println(test);

br.close();

}catch(IOException e) {

e.printStackTrace();

}

}

这里进行详细描述:

方法1:直接读取字节流,然后指定String的编码类型,也就是字节流当前的编码类型

方法2:指定读取文本采用的编码格式,返回的String实际上就是经过第一种方法的包装之后返回的。

温馨提示:读取sqlite数据库的时候,如果将GBK字节流存储进去,读取出来的时候采用getBytes,读取字节流,然后按照上面的方法进行转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值