Java default io reader does not recognize all BOM markers. It it known to be fixed in JDK6, but I havent tested it yet. You can use UnicodeReader class to overcome problems and auto-recognize bom markers. It will give a transparent behaviour to underlying inputstreams.
Example code using UnicodeReader class
Here is an example method to read text file. It will recognize bom marker and skip it while reading.
public static char[] loadFile(String file) throws IOException {
// read text file, auto recognize bom marker or use
// system default if markers not found.
BufferedReader reader = null;
CharArrayWriter writer = null;
UnicodeReader r = new UnicodeReader(new FileInputStream(file), null);
char[] buffer = new char[16 * 1024]; // 16k buffer
int read;
try {
reader = new BufferedReader(r);
writer = new CharArrayWriter();
while( (read = reader.read(buffer)) != -1) {
writer.write(buffer, 0, read);
}
writer.flush();
return writer.toCharArray();
} catch (IOException ex) {
throw ex;
} finally {
try {
writer.close(); reader.close(); r.close();
} catch (Exception ex) { }
}
}
Example code to write UTF-8 with bom marker
Write bom marker bytes to start of empty file and all proper text editors have no problems using a correct charset while reading files. Java's OutputStreamWriter does not write utf8 bom marker bytes.
public static void saveFile(String file, String data, boolean append) throws IOException {
BufferedWriter bw = null;
OutputStreamWriter osw = null;
File f = new File(file);
FileOutputStream fos = new FileOutputStream(f, append);
try {
// write UTF8 BOM mark if file is empty
if (f.length() < 1) {
final byte[] bom = new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF };
fos.write(bom);
}
osw = new OutputStreamWriter(fos, "UTF-8");
bw = new BufferedWriter(osw);
if (data != null) bw.write(data);
} catch (IOException ex) {
throw ex;
} finally {
try { bw.close(); fos.close(); } catch (Exception ex) { }
}
}
Example code using UnicodeReader class
Here is an example method to read text file. It will recognize bom marker and skip it while reading.
public static char[] loadFile(String file) throws IOException {
// read text file, auto recognize bom marker or use
// system default if markers not found.
BufferedReader reader = null;
CharArrayWriter writer = null;
UnicodeReader r = new UnicodeReader(new FileInputStream(file), null);
char[] buffer = new char[16 * 1024]; // 16k buffer
int read;
try {
reader = new BufferedReader(r);
writer = new CharArrayWriter();
while( (read = reader.read(buffer)) != -1) {
writer.write(buffer, 0, read);
}
writer.flush();
return writer.toCharArray();
} catch (IOException ex) {
throw ex;
} finally {
try {
writer.close(); reader.close(); r.close();
} catch (Exception ex) { }
}
}
Example code to write UTF-8 with bom marker
Write bom marker bytes to start of empty file and all proper text editors have no problems using a correct charset while reading files. Java's OutputStreamWriter does not write utf8 bom marker bytes.
public static void saveFile(String file, String data, boolean append) throws IOException {
BufferedWriter bw = null;
OutputStreamWriter osw = null;
File f = new File(file);
FileOutputStream fos = new FileOutputStream(f, append);
try {
// write UTF8 BOM mark if file is empty
if (f.length() < 1) {
final byte[] bom = new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF };
fos.write(bom);
}
osw = new OutputStreamWriter(fos, "UTF-8");
bw = new BufferedWriter(osw);
if (data != null) bw.write(data);
} catch (IOException ex) {
throw ex;
} finally {
try { bw.close(); fos.close(); } catch (Exception ex) { }
}
}
发表评论
-
菜鸟 Spring 源码解读 推荐流程
2012-01-11 09:18 5128Spring源代码解析(一):IOC容器:http://www ... -
深入剖析Classloader(一)--类的主动使用与被动使用
2011-12-27 22:13 1095我们知道java运行的是这样的,首先java编译器将我们的源代 ... -
Java中连接字符串时是使用+号还是使用StringBuilder?
2011-12-26 14:04 923字符串是Java程序中最常用的一种数据结构之一。在Java中的 ... -
转一篇有关Java的内存泄露的文章(受益哦)
2011-07-20 09:28 7741 引言 Java的一个 ... -
Tomcat内存溢出的原因
2011-07-19 09:41 730Tomcat内存溢出的原因 在生产环境中tomcat内 ... -
深入研究java.lang.ThreadLocal类
2011-07-13 09:39 685一、概述 ThreadLocal是什么呢?其实Thread ... -
jboss中实现跨war包session同步
2011-06-12 23:28 1290跨war包session同步解决方 ... -
开源框架spring详解-----AOP的深刻理解
2011-05-26 22:13 1251开源框架spring详解-----AOP的深刻理解 AOP的 ... -
struts2核心工作流程与工作原理
2011-05-26 15:35 12891. Struts2架构图 这是S truts2官方站点提供的 ... -
Spring注入方式及用到的注解 -----@Component,@Service,@Controller,@Repository
2011-05-26 15:04 1227注入方式: 把DAO实现 ... -
Java中的native关键字浅析(Java Native Interface)
2011-05-21 23:13 741JNI是Java Native Interface的 ... -
Volatile 变量
2011-04-26 17:01 656Java 语言中的 volatile 变量可以被看作是一种 “ ... -
Java对象的强、软、弱和虚引用
2011-04-26 16:04 6281.Java对象的强、软、 ... -
Web 应用程序常见漏洞 CSRF 的入侵检测与防范
2011-04-23 15:00 1120简介: 互联网的安全问题一直存在,并且在可预见的未来中没有消弭 ... -
详解XSS跨站脚本攻击
2011-04-23 13:46 1143一、什么是XSS攻击 XSS ... -
CSRF攻击原理解析
2011-04-22 10:29 12830×00. 前言 在Web程序中 ... -
selenium 初步体检之富文本框操作
2011-04-20 20:10 1542public class LoginTest extends ... -
webx
2011-03-05 17:54 1019webx 学习笔记。 -
java sftp tools
2011-02-24 13:30 1517import java.io.File; import jav ... -
HtmlUnit
2010-10-18 22:27 1658IntroductionThe dependencies pa ...
相关推荐
本文将深入探讨如何使用Java来处理带有BOM的UTF-8文件。 首先,`UnicodeInputStream`和`UnicodeReader`是Java中用于处理Unicode编码流的类。它们是`java.io`包的一部分,提供了对带有BOM的文件进行读取的功能。`...
这个场景中,我们面临的挑战是如何正确处理UTF-8带有BOM(Byte Order Mark)的文件,因为BOM可能会导致文件内容显示为问号或者其他乱码。下面将详细介绍如何解决这个问题。 首先,我们需要理解什么是UTF-8的BOM。...
4. **处理BOM头**:UTF-8有带BOM和不带BOM两种形式,如果文件开头带有BOM标记,可能需要在读取时进行特殊处理,因为某些库可能不支持带BOM的UTF-8。 5. **使用第三方库**:有一些Java库,如OpenCSV、Apache Commons...
以下是一个简单的示例,展示了如何读取带有BOM头的UTF-8文件,并将其写入一个新的不带BOM头的文件: ```java import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; ...
7. **注意文件的BOM头**:有些UTF-8编码的文件带有BOM(Byte Order Mark),在读取时如果不考虑BOM,也可能导致乱码。可以使用无BOM的UTF-8编码进行读取。 总之,解决Java读取中文文件乱码的关键在于确定正确的文件...
- BOM(Byte Order Mark):UTF-8编码的文件可以带有一个可选的BOM标记,用于指示数据流的字节顺序,但某些工具或程序可能不支持带BOM的UTF-8。 - 乱码问题:检查文件读取和写入时的编码设置,确保一致。 - 汉字全角...
例如,UTF-8编码的文件如果带有BOM(Byte Order Mark),则可以通过检查其前三个字节是否为` EF BB BF`来判断。 在实际项目中,我们还需要注意以下几点: - 在处理未知编码的文件时,可以尝试多种常见编码进行读取...
针对BOM头可能导致的页面顶部空白一行的问题,可以检查HTML文件是否带有BOM头,如果是,则按照上述方法去除。在PHP开发中,如果遇到因BOM头导致的隐形字符问题,可以使用上述方法去除BOM,或者在代码处理文件前先...
如果文件是UTF-8带BOM的,那么可能需要转换为无BOM的UTF-8或更改SourceInsight的配置以适应BOM编码。 2. **修改SourceInsight配置**:打开SourceInsight,进入“Options”(选项)菜单,选择“File Encoding”...
这是因为UTF-8编码的中文字符在传输时会带有字节顺序标记(BOM),即`EF BB BF`,在解码时如果不正确处理,会导致解码失败。 为了解决这个问题,可以在服务器端的Tomcat配置中设置`URIEncoding="UTF-8"`,并在...
在Java中,使用InputStreamReader和OutputStreamWriter与特定的字符编码(如"UTF-8")结合,可以确保数据读写时的正确编码。例如,当打开一个Excel文件时,可以设置适当的字符集来避免乱码: ```java InputStream ...
标题中的“BOM结构的更改标记不显示问题”是指在处理文本文件时,尤其是在编码格式为UTF-8的情况下,出现的Byte Order Mark (BOM) 不被正确显示或识别的问题。BOM是一个特殊的字符序列,用于标识文件是以UTF-8编码的...
- 在处理CSV文件时,注意文件的BOM头(Byte Order Mark),某些程序可能无法正确处理带有BOM头的UTF-8文件,因此在转换或导入前,可以考虑去除BOM。 - 如果是程序内部存储的数据出现乱码,检查代码中对字符串编码和...
常见的检测策略有BOM(Byte Order Mark)检查,对于UTF-16、UTF-8带有BOM的编码,可以通过首几个字节快速确定;对于无BOM的编码,可以使用诸如“频度统计”、“字节模式匹配”等方法进行推测。 2. **转换文件编码**...
如果在Eclipse中将Java源文件的编码从GBK改为UTF-8,而原始文件实际上是GBK编码的,那么在读取时就可能出现乱码,因为使用了错误的解码方式。 总结来说,字符编码涉及字符集、编码方案、字节流等多个层面,理解这些...
- **处理BOM头**:UTF-8有带BOM(Byte Order Mark)和不带BOM两种形式,根据需求选择合适的保存方式。 总的来说,批量修改TXT文档编码是一项常用但需谨慎的任务。正确理解和使用工具,能够有效解决编码不匹配带来的...
- UTF-8编码有两种形式:带BOM(Byte Order Mark)和不带BOM。BOM用于标识文件的编码格式,占用3个字节(0xEF 0xBB 0xBF)。在某些情况下,如使用文本编辑器创建的文件,是否包含BOM会影响文件大小和处理方式。 5....
如果你的Excel文件以UTF-8 BOM格式保存,那么在读取时可能需要进行额外处理,去除BOM标志。 此外,如果你需要在导入Excel数据后进行处理,例如数据库操作,你可能需要对数据进行转换和验证。Apache POI允许你访问...
- **BOM(Byte Order Mark)**:UTF-8编码的文件可能会带有BOM,某些程序可能会因此出现问题。 - **处理策略**:确保文件编码信息的准确传递,或使用能自动识别编码的工具。 5. **应用例程**: 提供的应用例程...