`
53873039oycg
  • 浏览: 843931 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java读取utf-8文件注意有无BOM

    博客分类:
  • java
 
阅读更多

    各位看标题就知道我要写什么了,先写结论,读取utf-8格式的文件时候,注意文件开头可能含有BOM标识符,结论写完了,下面的没必要看了,我记录下问题解决方法而已。

    

     虽然早知道utf-8文件可能含有bom标识符,我一直没碰到过,知道今天,我测试时候发现字符串长度不对劲,如下所示:

    

    长度不对劲,我就开始怀疑我碰上了传说中的BOM标识符了,下面可是验证,上代码:

    

public class UTFBOM文件处理 {
	public static void main(String[] args) throws Exception {
		List<String> resultList = readFileByLine("f:/saveFile/temp/name2.txt");
		String tmpStr = resultList.get(0);
		System.out.println(tmpStr + "----len=" + tmpStr.length());
		String tmpStr2 = new String(tmpStr.substring(0, 1));
		System.out.println(tmpStr2 + "----hex=" + strtoHex(tmpStr2));
	}

	public static String strtoHex(String s) {
		String str = "";
		for (int i = 0; i < s.length(); i++) {
			int ch = (int) s.charAt(i);
			String s4 = Integer.toHexString(ch);
			str = str + s4;
		}
		return "0x" + str;// 0x表示十六进制
	}

	public static List<String> readFileByLine(String filename) throws Exception {
		List<String> nameList = new ArrayList<String>();
		File file = new File(filename);
		InputStreamReader isr = new InputStreamReader(
				new FileInputStream(file), "UTF-8");
		BufferedReader reader = new BufferedReader(isr);
		String tmp = reader.readLine();
		while (tmp != null && tmp.trim().length() > 0) {
			nameList.add(tmp);
			tmp = reader.readLine();
		}
		reader.close();
		return nameList;
	}
}

    结果为:

   

掬水月在手----len=6
----hex=0xfeff

    看到好熟悉的feff。

    使用16进制打开文件,可以看到BOM标识符了。

   

    BOM是什么,可以
参考链接:

    http://mindprod.com/jgloss/bom.html

    ef bb bf

 

写道
UTF-8 endian, strictly speaking does not apply, though it uses big-endian most-significant-bytes first representation.

   

    解决方法:

    http://koti.mbnet.fi/akini/java/unicodereader/

   

public static List<String> readFileByLineWithOutBom(String filename)
			throws Exception {
		List<String> nameList = new ArrayList<String>();
		File file = new File(filename);
		InputStream in = new FileInputStream(file);
		BufferedReader reader = new BufferedReader(new UnicodeReader(in,
				"utf-8"));
		String tmp = reader.readLine();
		while (tmp != null && tmp.trim().length() > 0) {
			nameList.add(tmp);
			tmp = reader.readLine();
		}
		reader.close();
		return nameList;
	}

     带BOM标识符的文件怎么产生的呢?

     系统默认另存为utf-8保存的就是带bom的,以前一直用nodepad++另存为的,今天犯二了,忘了。

    

    全文完。

  • 大小: 32.4 KB
  • 大小: 65 KB
  • 大小: 50.7 KB
0
2
分享到:
评论
1 楼 xugangqiang 2014-03-13  
cool
这个非常好,解决了我一直以来的一个问题
即很多时候要native2ascii运行一下才ok的问题

相关推荐

    Java解决UTF-8的BOM问题

    本文将深入探讨如何使用Java来处理带有BOM的UTF-8文件。 首先,`UnicodeInputStream`和`UnicodeReader`是Java中用于处理Unicode编码流的类。它们是`java.io`包的一部分,提供了对带有BOM的文件进行读取的功能。`...

    java 读取服务器上的某个文件,并解决UTF-8 BOM文件的问号问题

    在Java编程中,读取...总结来说,Java中读取服务器上的UTF-8 BOM文件,需要正确设置字符编码,检测并处理BOM,同时注意异常处理和资源释放。通过掌握这些知识点,开发者可以编写出稳定、高效的代码来处理这类问题。

    Java避免UTF-8的csv文件打开中文出现乱码的方法

    Java避免UTF-8的csv文件打开中文出现...Java避免UTF-8的csv文件打开中文出现乱码的方法是使用UTF-16LE编码格式,并在文件头部输出BOM。同时,需要考虑Excel版本的兼容性问题,以确保csv文件可以正确地被打开和读取。

    批量去掉UTF-8文件中BOM标示符

    标题"批量去掉UTF-8文件中BOM标示符"指的是处理这一问题的方法,即通过特定工具或代码删除UTF-8文件开头的BOM标识。这个过程通常是为了确保文件在不同的系统和环境中能够正确无误地被读取和处理。 描述中提到的博文...

    VBA Fans读取和写入UTF-8格式文本文件

    本主题将深入探讨如何使用VBA来读取和写入UTF-8编码的文本文件,这对于处理多语言数据或需要跨系统兼容性的项目尤为重要。 1. **UTF-8编码介绍** UTF-8是一种广泛使用的Unicode字符编码,能够表示Unicode字符集中...

    gb2312,utf-8,utf-8-bom等编码格式的互相转换

    3. 如果需要读取有BOM的UTF-8文件并转换为其他编码,可以先去除BOM,然后再进行转换: ```csharp using (FileStream fileStream = new FileStream("带有BOM的UTF8File.txt", FileMode.Open)) { byte[] bom = new ...

    批量utf文件转utf8-bom

    "批量utf文件转utf8-bom"这个主题指的是将一批以UTF编码的文件转换为带有BOM(Byte Order Mark)的UTF-8编码。BOM是一个特殊的字节序列,用于标识文件的编码类型,对于UTF-8编码,BOM的字节序列为0xEF, 0xBB, 0xBF。...

    PB字符串转XML文件,解决PB12.5创建UTF-8文件BOM问题(powerbuilder 12.5)

    解决PB创建UTF-8文件带BOM问题; 2.字段串直接生成XML文件。 由于项目需要,需要字符串转为XML文件,直接用Fileopen进行EncodingUTF8编码后,发现文件实际为UTF-8 BOM编码 问度娘发现有相同问题,但解决方式是利用...

    MFC读取utf8示例

    函数接受一个文件路径作为参数,然后打开文件,跳过可能存在的BOM(UTF-8的BOM是三个字节:0xEF, 0xBB, 0xBF),逐行读取内容并使用`AfxMessageBox`显示。注意,由于`AfxMessageBox`处理的是宽字符字符串,所以在...

    delphi保存读取utf-8的文本文件.mht

    delphi保存读取utf-8的文本文件.mht

    utf-8.rar_c++ string utf-8_string to utf-8_utf_utf 8_utf-8

    在提供的`utf-8.txt`文件中,可能包含了有关UTF-8编码的示例或者测试数据。你可以使用C++的标准库函数`std::ifstream`和`std::ofstream`来读写这个文件,但记得设置正确的编码模式。 总之,C++虽然没有内建的UTF-8...

    php检测文件夹下有含BOM的UTF-8的文件

    然而,UTF-8的BOM并不是必需的,因为UTF-8是无字节顺序的,BOM的存在有时反而会引起问题,比如在某些编辑器中显示乱码或者在处理文件时出现错误。 标题提到的问题是关于如何使用PHP来检测一个文件夹中所有UTF-8格式...

    utf-8文件格式转换工具

    这个过程中需要注意的是,如果原始文件中包含无法映射到UTF-8的字符,转换可能会导致乱码或者丢失信息,因此在转换前最好备份原始文件。 转换工具通常提供批量处理功能,例如压缩包中的"gb2utf8"可能就是这样一个...

    UTF-8转ANSI文本文件转换器

    转换器的工作原理通常是读取UTF-8编码的文件,解析其中的每个字符,然后根据ANSI编码的规则重新编码。由于两种编码的字符映射不完全相同,转换过程中可能会出现乱码情况,特别是当源文件包含ANSI编码不支持的字符时...

    java jsp解决utf-8乱码.zip

    在Java JSP开发中,遇到UTF-8编码导致的乱码问题是一个常见的困扰。这个问题主要涉及到字符编码的统一和正确处理。UTF-8是一种广泛使用的Unicode字符编码方案,它可以支持几乎所有的字符集,包括中文、日文和韩文。...

    delphi 6-XE读取ANSI,unicode,unicode big,utf-8,utf-8BOM文件,保存utf8

    delphi 6-XE读取ANSI,unicode,unicode big,utf-8,utf-8BOM文件,保存utf8

    快速转码(UTF-8转ASCII)

    如果要转换整个文件的编码,可以使用`java.io`或`java.nio.file`包中的类来读取UTF-8编码的文件,转换后写入ASCII编码的文件。 总结来说,"快速转码(UTF-8转ASCII)"是一个常见的编程需求,尤其在Java Web开发中。...

    解决Invalid byte 1 of 1-byte UTF-8 sequence

    byte UTF-8 sequence-中文版的window下java的默认的编码为GBK.url":这个文件名暗示了解决XML文件读取异常的方法,尤其是在Windows环境下,Java默认的文件编码可能是GBK,这可能导致读取包含UTF-8编码的XML文件时...

    php utf-8编码去bom小工具

    BOM是UTF-8编码的一个可选特征,它在文件开头放置三个特殊的字节来标识文件的字符编码,但这可能会导致在某些编辑器或浏览器中出现不必要的字符或者乱码问题。因此,开发这个小工具是为了帮助开发者处理这个问题。 ...

Global site tag (gtag.js) - Google Analytics