java读取文件是乱码_java读取txt文件乱码解决方案
因为txt默认的选项是ANSI,即GBK编码。GBK和GB2312都是中文编码,在这里解释一下两者的区别。
总体说来,GBK包括所有的汉字,包括简体和繁体。而gb2312则只包括简体汉字。
GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号, 21003个汉字及提供了1894个造字码位。 Microsoft简体版中文Windows 95就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。
GB码,全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。
GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
那么如何查看txt的编码呢,教你一个笨笨的办法:打开文件——另存为,然后看到最下面的编码,默认选择的就是当前文档的编码格式)。
txt文本文档有四种编码选项:ANSI、Unicode、Unicode big endian、UTF-8;默认应该是ANSI选项,就是系统的默认编码,一般是GBK。
因此我们读取txt文件可能有时候并不知道其编码格式,所以需要用程序动态判断获取txt文件编码,这里给一点资料,参考参考:
ANSI: 无格式定义
Unicode: 前两个字节为FFFE Unicode文档以0xFFFE开头
Unicode big endian: 前两字节为FEFF
UTF-8: 前两字节为EFBB UTF-8以0xEFBBBF开头
用程序取出前几个字节并进行判断即可。
首先对java中得编码格式进行了研究。发现在java中
java编码与txt编码对应
java
txt
unicode
unicode big endian
utf-8
utf-8
utf-16
unicode
gb2312
ANSI
java读取txt文件,如果编码格式不匹配,就会出现乱码现象。所以读取txt文件的时候需要设置读取编码。txt文档编码格式都是写在文件头的,在程序中需要先解析文件的编码格式,获得编码格式后,在按此格式读取文件就不会产生乱码了。
代码示例如下:
package com.lfl.attachment;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
public class TextMain {
public static void main(String[] args) throws Exception {
String filePath = "D:/article.txt";
//String filePath = "D:/article333.txt";
//String filePath = "D:/article111.txt";
String content = readTxt(filePath);
System.out.println(content);
}
/**
* 解析普通文本文件 流式文件 如txt
* @param path
* @return
*/
@SuppressWarnings("unused")
public static String readTxt(String path){
StringBuilder content = new StringBuilder("");
try {
String code = resolveCode(path);
File file = new File(path);
InputStream is = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(is, code);
BufferedReader br = new BufferedReader(isr);
//char[] buf = new char[1024];
//int i = br.read(buf);
//String s= new String(buf);
//System.out.println(s);
String str = "";
while (null != (str = br.readLine())) {
content.append(str);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
System.err.println("读取文件:" + path + "失败!");
}
return content.toString();
}
public static String resolveCode(String path) throws Exception {
//String filePath = "D:/article.txt";//[-76, -85, -71] ANSI
//String filePath = "D:/article111.txt";//[-2, -1, 79] unicode big endian
//String filePath = "D:/article222.txt";//[-1, -2, 32]unicode
//String filePath = "D:/article333.txt";//[-17, -69, -65] UTF-8
InputStream inputStream = new FileInputStream(path);
byte[] head = new byte[3];
inputStream.read(head);
String code = "gb2312"; //或GBK
if (head[0] == -1 && head[1] == -2 )
code = "UTF-16";
else if (head[0] == -2 && head[1] == -1 )
code = "Unicode";
else if(head[0]==-17 && head[1]==-69 && head[2] ==-65)
code = "UTF-8";
inputStream.close();
System.out.println(code);
return code;
}
}
注意:在resolveTxt方法中不能通过readTxt方法传InputStream流 ,这样会使两个方法持有同一个流引用,而在resolveTxt方法中已读过流中的三个字节,流中的pos此时已经是3了,而不是流的起始位置,再在readTxt中读取时就会出现IOException:Read Error。
java读取文件是乱码_java读取txt文件乱码解决方案相关推荐
- java读取文件并输出_java读取txt文件并输出结果
这篇文章主要介绍了java读取txt文件并输出结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 描述: 1.java读取指定txt文件并解析 文件 ...
- java读取文件夹下的所有txt文件,java读取文件夹下文件及txt内容
public class PositionController { // 读取txt内容 public static String txt2String(File file) { StringBuil ...
- android 读写文件 简书,Android写入txt文件并读取
直接上代码~ 注意权限 1.写入数据 private void writeData() { String filePath = "/sdcard/Gyt/"; String fil ...
- xps数据怎么导出为txt_WFP: 读取XPS文件或将word、txt文件转化为XPS文件
读取XPS格式文件或将doc,txt文件转化为XPS文件,效果图如下: 1.XAML页面代码: xmlns="http://schemas.microsoft.com/winfx/2006/ ...
- matlab 按分隔符提取,Matlab:如何读取具有多个分隔符的.txt文件
这是我在stackoverflow上的第一个问题.我用Matlab使用textread读取.txt文件时出现问题. .txt真的很乱,有如下结构.Matlab:如何读取具有多个分隔符的.txt文件 & ...
- java资源文件获取属性_Java读写资源文件类Properties
Java中读写资源文件最重要的类是Properties 1) 资源文件要求如下: 1.properties文件是一个文本文件 2.properties文件的语法有两种,一种是注释,一种属性配置. 注 ...
- php更改txt文件,如何使用php对txt文件进行修改
如何使用php对txt文件进行修改 发布时间:2020-08-03 10:16:50 来源:亿速云 阅读:67 作者:Leah 如何使用php对txt文件进行修改?针对这个问题,这篇文章详细介绍了相对 ...
- mfc下创建html文件,用MFC怎么创建TXT文件并写入数据
应该是你的路径写法不正确造成的,是不是没有注意'\'的写法,在C++里要表示'\'就要写成'\\'. 比如表示C:\1\2.txt,就应该写成C:\\1\\2.txt 可以用SHFileOperati ...
- java读txt文件乱码_java读取txt文件时出现中文乱码怎么解决
java读取txt文件时出现中文乱码怎么解决 发布时间:2020-06-25 15:27:31 来源:亿速云 阅读:105 作者:Leah java读取txt文件时出现中文乱码怎么解决?针对这个问题, ...
最新文章
- linux下tomcat6无法显示图片验证码 少了图形插件
- mysql 语句性能分析_mysql的sql语句的性能诊断分析
- iOS利用视频做起始页
- 测试Live Write的插件
- static变量 java
- 告别并不遥远的儿时,抬眼期待未来
- C++ 多字节与宽字符串的相互转换
- c语言中isdigit函数_在C / C ++中使用isdigit()
- 19.简报配置(Newsletter Configuration)
- 剖析云计算和大数据落地后x86服务器的业务痛点
- 深入了解DSP和ARM的关系(相同与区别)
- 测试家里网速用什么软件,怎么测试网速,测试网速用什么软件
- EasyRecovery15可靠的数据恢复软件
- cad中计算机的快捷键,CAD中一些常用的快捷键用法
- 第二课:基于树莓派的10个经典项目(树莓派能做什么)
- GPS导航电文——第二子帧数据解析
- 绘声绘影X4 个人MV制作
- 【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
- java web 有什么区别吗_web和java一样吗?有什么区别?
- 《牛客刷verilog》Part I Verilog快速入门
热门文章
- Obsidian media extended以及bilibili插件链接总是打开外部网页以及退回编辑视图会弹出另外一个相同文件
- linux安装java.jdk环境
- python 计算物理_计算物理期末报告
- leet75:颜色分类
- F - Ilya Muromets Gym - 100513F
- Oracle数据库:oracle内连接inner join on,多表查询各种自链接、内连接、外连接的练习示例
- 顶级程序员书单系列二:《编码-隐匿在计算机软硬件背后的语言》
- [宋史学习] 三省六部制的破坏与宋初的中央政府机构
- 行业集中度数据(2000-2020年 )
- [NOIP]模拟17 题解