`
53873039oycg
  • 浏览: 841367 次
  • 性别: 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中,当我们从UTF-8编码的文本文件读取内容时,如果文件开头带有BOM,可能会导致程序错误解析字符串,因为BOM并不是实际的文本内容,而是编码的标记。例如,如果你使用Java的默认`BufferedReader`或者`Scanner`...

    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标识。这个过程通常是为了确保文件在不同的系统和环境中能够正确无误地被读取和处理。 描述中提到的博文...

    UTF-8文件批量去除BOM标记

    总的来说,UTF-8文件的BOM标记是一个在编码和解码过程中需要注意的细节。批量去除BOM工具的存在,为开发者提供了一种便捷的解决方案,帮助他们处理那些因为BOM引发的问题,确保文件的兼容性和正确性。在处理大量UTF-...

    批量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编码 问度娘发现有相同问题,但解决方式是利用...

    java 编码 UTF-8、ISO-8859-1、GBK

    例如,读取文本文件时,应使用`InputStreamReader`和合适的编码参数,如`new InputStreamReader(new FileInputStream(file), "UTF-8")`。 总结,理解并正确处理Java中的字符编码问题,需要关注整个数据流程,从...

    MFC读取utf8示例

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

    读取ANSI、Unicode、Unicode big endian、UTF-8、UTF8 Bom、UTF16-LE明码文件

    读取ANSI 明码文件 读取Unicode 明码文件 读取Unicode big endian 明码文件 读取UTF-8 明码文件 读取UTF8 Bom 明码文件 读取UTF16-LE 明码文件 读取UTF16-BE 明码文件 到多字节字符串 扩展类CFilePlainCode

    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...

    pb12 gb转utf-8

    压缩包子文件的文件名“pb12 gb转utf-8”和“pb12 gbתutf-8”(可能是“ת”键输入错误,实际应为“转”)表明里面可能包含了一些转换过程中使用的脚本、工具或者转换后的数据样本。在解压并检查这些文件时,我们...

    PB9转换utf-8例子

    标题中的“PB9转换utf-8例子”指的是在PowerBuilder 9(PB9)环境下将数据从非UTF-8编码转换为UTF-8编码的一种解决方案。由于PB9本身不直接支持这种转换,开发者通常需要利用外部库或者特定的编程技巧来实现这个功能...

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

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

    批量将文件编码方式由ansi转为utf-8

    3. **处理 bom**:UTF-8有两种形式,带BOM(字节顺序标记)和不带BOM,根据需要选择合适的转换结果。 4. **处理异常文件**:有些文件可能包含无法正确转换的特殊字符,需要特别处理。 5. **确认转换后兼容性**:确保...

    utf-8文件格式转换工具

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

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

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

    快速转码(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文件时...

    易语言另类数据库读写UTF-8

    在易语言中实现另类数据库读写UTF-8,主要是为了克服原生支持的不足,提供更灵活和高效的数据存储与读取方式。 首先,我们需要了解易语言中的数据库接口。易语言提供了多种数据库操作的模块,如ODBC(Open Database...

Global site tag (gtag.js) - Google Analytics