问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么读取java文件中字符编码格式

发布网友 发布时间:2022-04-23 04:51

我来回答

1个回答

热心网友 时间:2022-04-23 09:57

1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK。
按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。
对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下:
File file = new File(path);
InputStream in= new java.io.FileInputStream(file);
byte[] b = new byte[3];
in.read(b);
in.close();
if (b[0] == -17 && b[1] == -69 && b[2] == -65)
System.out.println(file.getName() + ":编码为UTF-8");
else
System.out.println(file.getName() + ":可能是GBK,也可能是其他编码");
2:若想实现更复杂的文件编码检测,可以使用一个开源项目cpdetector,它所在的网址是:http://cpdetector.sourceforge.net/。它的类库很小,只有500K左右,cpDetector是基于统计学原理的,不保证完全正确,利用该类库判定文本文件的代码如下:
读外部文件(先利用cpdetector检测文件的编码格式,然后用检测到的编码方式去读文件):
/**
* 利用第三方开源包cpdetector获取文件编码格式
*
* @param path
* 要判断文件编码格式的源文件的路径
* @author huanglei
* @version 2012-7-12 14:05
*/
public static String getFileEncode(String path) {
/*
* detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
* cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、
* JChardetFacade、ASCIIDetector、UnicodeDetector。
* detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
* 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
* cpDetector是基于统计学原理的,不保证完全正确。
*/
CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
/*
* ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
* 指示是否显示探测过程的详细信息,为false不显示。
*/
detector.add(new ParsingDetector(false));
/*
* JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
* 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
* 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
*/
detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
// ASCIIDetector用于ASCII编码测定
detector.add(ASCIIDetector.getInstance());
// UnicodeDetector用于Unicode家族编码的测定
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset = null;
File f = new File(path);
try {
charset = detector.detectCodepage(f.toURI().toURL());
} catch (Exception ex) {
ex.printStackTrace();
}
if (charset != null)
return charset.name();
else
return null;
}
String charsetName = getFileEncode(configFilePath);
System.out.println(charsetName);
inputStream = new FileInputStream(configFile);
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, charsetName));
读jar包内部资源文件(先利用cpdetector检测jar内部的资源文件的编码格式,然后以检测到的编码方式去读文件):
/**
* 利用第三方开源包cpdetector获取URL对应的文件编码
*
* @param path
* 要判断文件编码格式的源文件的URL
* @author huanglei
* @version 2012-7-12 14:05
*/
public static String getFileEncode(URL url) {
/*
* detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
* cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、
* JChardetFacade、ASCIIDetector、UnicodeDetector。
* detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
* 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
* cpDetector是基于统计学原理的,不保证完全正确。
*/
CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
/*
* ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
* 指示是否显示探测过程的详细信息,为false不显示。
*/
detector.add(new ParsingDetector(false));
/*
* JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
* 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
* 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
*/
detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
// ASCIIDetector用于ASCII编码测定
detector.add(ASCIIDetector.getInstance());
// UnicodeDetector用于Unicode家族编码的测定
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset = null;
try {
charset = detector.detectCodepage(url);
} catch (Exception ex) {
ex.printStackTrace();
}
if (charset != null)
return charset.name();
else
return null;
}
URL url = CreateStationTreeModel.class.getResource("/resource/" + "配置文件");
URLConnection urlConnection = url.openConnection();
inputStream=urlConnection.getInputStream();
String charsetName = getFileEncode(url);
System.out.println(charsetName);
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, charsetName));
3:探测任意输入的文本流的编码,方法是调用其重载形式:
charset=detector.detectCodepage(待测的文本输入流,测量该流所需的读入字节数);
上面的字节数由程序员指定,字节数越多,判定越准确,当然时间也花得越长。要注意,字节数的指定不能超过文本流的最大长度。
4:判定文件编码的具体应用举例:
属性文件(.properties)是Java程序中的常用文本存储方式,象STRUTS框架就是利用属性文件存储程序中的字符串资源。它的内容如下所示:
#注释语句
属性名=属性值
读入属性文件的一般方法是:
FileInputStream ios=new FileInputStream(“属性文件名”);
Properties prop=new Properties();
prop.load(ios);
String value=prop.getProperty(“属性名”);
ios.close();
利用java.io.Properties的load方法读入属性文件虽然方便,但如果属性文件中有中文,在读入之后就会发现出现乱码现象。发生这个原因是load方法使用字节流读入文本,在读入后需要将字节流编码成为字符串,而它使用的编码是“iso-8859-1”,这个字符集是ASCII码字符集,不支持中文编码,
方法一:使用显式的转码:
String value=prop.getProperty(“属性名”);
String encValue=new String(value.getBytes(“iso-8859-1″),”属性文件的实际编码”);
方法二:象这种属性文件是项目内部的,我们可以控制属性文件的编码格式,比如约定采用Windows内定的GBK,就直接利用”gbk”来转码, 如果约定采用UTF-8,就使用”UTF-8″直接转码。
方法三:如果想灵活一些,做到自动探测编码,就可利用上面介绍的方法测定属性文件的编码,从而方便开发人员的工作
补充:可以用下面代码获得Java支持编码集合:
Charset.availableCharsets().keySet();
可以用下面的代码获得系统默认编码:
Charset.defaultCharset();
怎么读取java文件中字符编码格式

2:若想实现更复杂的文件编码检测,可以使用一个开源项目cpdetector,它所在的网址是:http://cpdetector.sourceforge.net/。它的类库很小,只有500K左右,cpDetector是基于统计学原理的,不保证完全正确,利用该类库判定文本文件的代码如下:读外部文件(先利用cpdetector检测文件的编码格式,然后用检测到的编码...

Java读取文件内容(Java读取文件内容为字符串)

System.out.println("以字符为单位读取文件内容,一次读多个字节:"); //一次读多个字符 char[]tempchars=newchar[30]; intcharread=0; reader=newInputStreamReader(newFileInputStream(fileName)); //读入多个字符到字符数组中,charread为一次读取字符数 while((charread=reader.read(tempchars))!=-1){ //...

java有没有那个方法 获取文件保存的编码方式啊?

正常的方法是当你读取一个文件时,应该有人已经告诉了你这个文件是字符集是什么。这个过程应该是人工决定的,比如人们把它写在一个配置文件中,或者约定了整个软件只使用 UTF8 或 GBK 一种编码方式。作为一个通用型的软件推荐使用 UTF8 而不是 GBK,因为当你保存一个人名时你也知道这片神奇的土地上...

用Java读写文件(输入/输出)-教程

1.2. 用Java读取文件 读取文本文件,可以使用Files.readAllBytes方法。下面的清单演示了此方法的用法。要逐行将文本文件读入字符串结构类型String Structure的列表,可以使用Files.readAllLinesmethod.Files.readAllLinesmethod. 使用UTF-8字符编码。它还确保在读取所有字节后或在发生异常时关闭文件。1.3. 逐行...

java代码如何获取文件的编码格式

若想实现更复杂的文件编码检测,可以使用一个开源项目cpdetector,它所在的网址是:http://cpdetector.sourceforge.net/。它的类库很小,只有500K左右,cpDetector是基于统计学原理的,不保证完全正确

Error:(1, 1) java: 非法字符: ‘\ufeff’

1. 首先,打开你的 Java 文件。在文件的顶部或底部,你应该能看到一个类似于 "UTF-8" 的字符编码声明。2. 如果编码是 "UTF-8",请尝试将它改为 "GBK",然后保存文件。这一步的目的是更改文件的编码格式。3. 打开 IDEA,并重新加载文件。如果错误仍然存在,那么请将编码改回 "UTF-8"。在这...

Java 如何设置打开文件内容的字符集

rewrite本身似乎完全是采用字节处理的方式,而不考虑字符串的编码,所以不会带来编码问题。 5.3. URLEncode.encode() 这是Java本身提供对的URL编码函数,完成的工作和上述UTF-8选项有效时浏览器所做的工作相似。值得说明的是,java已经不赞成不指定编码来使用该方法(deprecated)。应该在使用的时候增加编码指定。 当不指定...

java判断文件编码格式 怎么判断编码格式

1字节:0xxxxxxx 2字节:110xxxxx 10xxxxxx 3字节:1110xxxx 10xxxxxx 10xxxxxx 4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。举例代码:java.io.File f=new java.io.File("待判定的文本文件名");try{ java.io....

java中如何从文件中读取数据

◎◎◎FileReader 字符输入流读文件◎◎◎ public class Maintest { public static void main(String[] args) throws IOException { File f=new File("H:\\just for fun\\xiangwei.txt");FileReader fre=new FileReader(f);BufferedReader bre=new BufferedReader(fre);String str="";while((str=...

怎样用Java读取TXT文本乱码解决方案

这个方法很简单,就是获取txt文件中的一行数据,然后转换为数组,我这个文本中只有一行。就这种情况下获取到的str是乱码,我想出现乱码肯定是字符集编码的问题,然后自己新建了一个文本文档测试没有问题(开始用的文本时别的程序导出的),所以我估计是开始那个txt文件编码的问题,查看发现是Unicode编码(如何...

java字符流编码格式 java字符串转换编码格式 java文件编码格式 java怎么改编码格式 java转换文件编码格式 对于字符编码通常用什么编码 java获取编码格式 字符编码格式 ue修改字符编码格式
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
g7346次列车途经站点,鹤壁北站旅游路线 这就是江湖昆仑天池在哪里-这就是江湖昆仑天池位置 这就是江湖天池钓鱼怎么弄-天池钓鱼玩法技巧分享 最好的姐妹不再信任自已了,还需要挽留吗? 孩子现在读四年级下册,英语零基础26个字母都不认识,一个半月能补上吗... 车子半年不开有没有问题呀 车半年不开没事吧 两江新区两化融合贯标需要什么条件? 竹字头加生念什么 长汀县经济发展 美国的联想y700为什么不能下中国的游戏呢?主要是下载了qq飞车不能安装... 薛之谦自曝曾建议赵英俊留个孩子,透露他患病2年一直瞒着妈妈,啥情况? 拳皇98终极之战ol 格斗家暴击率怎么提升 如何根据指定格式用Java编写在字符串中找到符合格式的字符串 薛之谦的歌曲最好听有哪些? 王者荣耀:不知火舞竟活活被后羿大死,究竟是什么操作 终于盼到薛之谦“女儿”长大,看到照片的那一刻,神似宋祖儿!长相如何? 不知火舞切后排也很厉害,她可以去打野吗? JAVA按格式输出字符串 王者荣耀有没有法师暴击流? 跪求大神 Java如何根据规则生成有一定格式的字符串 薛之谦几岁出道的? 请问小米手机的手电筒满电可以亮多久 王者荣耀娜可露露和不知火舞哪个厉害? java中如何从格式化字符串输入数值 想知道薛之谦唱的小孩歌词 王者荣耀不知火舞打野怎么出装最好 为什么说不知火舞很垃圾 如何评价薛之谦新歌《小孩》 java通过键盘输入字符串转换成如下格式输出 不知火舞怎么连招打出最高输出 王者荣耀不知火舞与马可菠萝哪个历害 薛之谦在有了孩子之后,为什么圈内没有人祝福? 怎么 知道 java字符串 编码格式 《王者荣耀》里面法师需要暴击率的铭文吗? 小孩薛之谦表达啦什么感情 java 中怎样输入参数? 王者荣耀貂蝉1v1怕什么 薛之谦的哪些歌词是可以作签名的? 薛之谦小孩吉他谱c调 java怎么验证一个字符串的格式 动漫一人之下第一集里的是什么歌 小孩唱歌的综艺节目,有薛之谦 薛之谦在谁是大歌神唱小孩的哪一期 薛之谦升级当爸,晒孩子手指照会被批评的原因是什么? 薛之谦高磊鑫一家三口同框,宝宝乖巧头发浓密,俩人的感情有多曲折? 薛之谦自曝曾建议赵英俊留个孩子,你如何看待这个建议? 海尔空调外机漏水是怎么回事?注意什么问题呢? 如何解决海尔空调外机 流水? 海尔空调室外机流水怎么回事? 海尔空调制热排水管不滴水,外机滴水属正常化霜是什么原因?