跨平台UTF-8编码问题
1. 背景
这段时间有需要在Windows和Linux两个系统中进行java的编码。代码先是在Linux平台中进行编写,测试;功能正常之后,迁移到Windows平台。
迁移到Windows平台之后,因为发现有一两个细节需要调整,所以直接在Windows平台上进行改动;但是改动完后的工程无法编译打包,直接提示错误。
我的java工程,使用maven进行依赖的管理,使用eclipse进行代码的开发。Maven中的pom.xml文件定义的工程编码也是UTF-8。
2. 问题
最先发现的问题,是Windows下的eclipse和Linux下的eclipse的默认编码类型不同;Windows平台中的默认编码类型是GB18030,Linux平台的默认编码是UTF-8。此时的错误是“不可映射的字符xxx”;修改方案是把Windows平台下面的java工程的编码格式变更为UTF-8。
因为UTF-8和GB18030本身对字符的表示不同,尤其是中文字符,我们需要对于转换后的源码进行一次检查——如果不进行解决,在进行编译的时候,也有可能出现字符不可识别的问题;如果发现有乱码,则需要重写乱码的这一部分。当然,最简单的就是所有的编码中,不要有中文表示;如果需要注释,也选择英文……
原以为这就是所有的问题了,但是在执行“maven package”进行打包的时候,出现了“xxx.java:[1,0] 需要为class、interface或者enum”的报错提醒,然后打包失败了。对于所有的代码,在IDE中没有任何的错误提醒;甚至将工程重新放在Linux的平台下进行查看,从编辑器中看不出任何问题,但是就是无法编译打包。
此时可以基本确定原因是字符编码的问题,但是无法进行问题排查,因为看不到进一步的信息。不使用IDE的编辑器,使用notepad++和sublime text进行源码文件的查看,终于发现了问题。在sublime text的状态栏中,可以看到有错误的异常。“UTF-8, opened as UTF-8 with BOM (document maybe broken), UTF-8, Unix, Line xx, Column xx”;这里说明现在文件的编码是带有BOM的UTF-8格式,但是该格式可能被破坏了。
3. 原因
BOM(Byte Order Mark),字节序标识,主要用于Unicode系列编码的扩展;但是因为某些原因,java在编译的时候,不识别UTF-8的BOM结构。(JDK Bug 4508058:Java InputStreamReader will support BOM mark for UTF-16 files. But for some reason it does not recognize UTF-8 BOM marks. This is very unfortunate all Windows (>win2k) users if text files are saved with Notepad using UTF-8 format. Notepad will add BOM bytes at the start of file, but Java's InputStreamReader does not skip it.)
UTF-8的BOM,在文件头部附加“EF BB BF”,该字符串序列在编辑器中是不可见的;所以通过一系列的编辑器来查看,是看不到问题的。但是java在进行编译的时候,不会忽略这部分;因此就影响到了正常代码的编译——主要是对于package关键字,无法进行识别了,导致上面的错误。
4. 解决方法
找到问题所在,就比较好办了。最简单的方法,使用notepad++打开有问题的java源代码,然后“格式 -> 以UTF-8无BOM格式编码”,这样保存文件后即可。
想要复杂深入一点,可以写段代码进行文件头的读取和处理;某些web内容就是这么处理的;使用HTTPCLIENT得到的响应内容是UTF-8带BOM的,此时对于整个输入流,读取前三个字节,判断是否为“EF BB BF”,如果是,则截掉。
5. 参考资料
http://koti.mbnet.fi/akini/java/unicodereader/
http://www.unicode.org/faq/utf_bom.html#BOM
相关推荐
UTF-8编码和GBK编码互转,一个头文件搞定!跨平台不使用第三方库。只需要添加一些C语言标准的头文件即可实现俩种编码互相转换。摆脱第三方库移植问题。原理是将UTF-8编码的汉字、字母、符号、数字等转换成unicode...
在C++编程中,UTF-8编码是一种广泛使用的字符编码标准,它能够表示Unicode字符集中的所有字符。本文将深入探讨如何在C++中处理UTF-8字符串,并介绍相关的关键概念和技术。 首先,C++标准库并没有直接支持UTF-8编码...
在LabVIEW编程环境中,"UTF-8toGBK.vi"这个程序可能是一个用户自定义的VI(Virtual Instrument),用于将UTF-8编码的字符串转换为GBK编码。LabVIEW作为一个图形化编程语言,提供了丰富的字符串处理函数,其中包括了...
UTF-8编码是一种广泛使用的字符编码标准,它在信息技术领域起着至关重要的作用。这个“UTF-8编码转换器”工具旨在帮助用户方便地将文本数据从其他编码格式转换为UTF-8,确保数据在不同系统和平台之间的兼容性。 在...
标签“pb9 utf-8”明确了讨论的是与PowerBuilder 9相关的UTF-8编码问题。UTF-8是一种广泛使用的Unicode字符编码,能够表示Unicode字符集中几乎所有的字符,包括世界各地的多种语言文字。 在压缩包的文件列表中,有...
在IT领域,文本文件的编码方式对于正确地读取和处理文本至关重要。UTF-8是一种广泛使用的字符编码标准,能够表示...在实际开发中,我们应该养成良好的编码习惯,尽量使用标准的UTF-8编码,以减少潜在的兼容性问题。
### UTF-8编码详解与汉字码表解析 #### UTF-8编码原理 UTF-8(Unicode Transformation Format - 8 bits)是一种变长字符编码,由Ken Thompson于1992年设计,旨在解决多语言环境下字符编码兼容性问题。其核心优势...
总之,UTF-8编码转换工具是一个实用的工具,可以帮助用户在处理各种编码问题时进行转换。了解UTF-8编码的工作原理和应用场景,对于从事IT工作的人来说是必不可少的基础知识。在实际工作中,无论是开发网页、编写代码...
对于ASCII字符,UTF-8编码与ASCII相同,都是单字节。UTF-8的特殊之处在于它包含一个字节顺序标记(BOM),即UTF-8+BOM,但大多数情况下,UTF-8无BOM更常见。 在PHP中,进行字符编码转换可以使用内置函数,如`mb_...
在实际项目中,使用这样的库可以简化处理跨平台UTF-8字符串的复杂性。通过`source`文件,我们可以看到源代码实现,了解其内部工作原理和具体API。而`doc`文件可能包含了库的使用文档和示例,帮助开发者快速上手。 ...
GBK编码和UTF-8编码是两种广泛使用的字符编码标准,它们各有特点,但不兼容,因此在不同环境下进行数据交换时,需要进行相应的转换。 GBK编码是中国大陆广泛采用的一种汉字编码标准,它是GB2312的扩展,包含了更多...
这通常是由于ANSI编码不支持某些非英文字符,或者在跨平台交互时可能会遇到问题,而UTF-8编码则具有更广泛的支持和兼容性。 描述中提到"方便快速,转换速度快并且无错误,容易操作",这意味着所使用的工具或方法...
在"xml.rar_UTF XML_UTF-8编码_utf_utf-8_xml utf-8"这个压缩包中,我们主要探讨的是与XML文档相关的编码问题,特别是UTF-8编码。 UTF-8是一种广泛使用的Unicode字符编码方案。它能够表示Unicode标准中的所有字符,...
总之,“pb12 gb转utf-8”是一个关于使用PowerBuilder 12将GBK编码的数据转换为UTF-8编码的过程,这在处理多语言环境或者跨平台应用时尤其重要。理解和掌握这种转换技巧对于确保数据的正确性和兼容性是至关重要的。
2. **跨平台兼容**:多数现代操作系统和编程语言默认支持UTF-8,因此使用UTF-8编码的脚本在不同平台上运行更稳定。 3. **避免乱码问题**:在处理非中文字符时,GBK或GB2312可能会出现乱码,而UTF-8则不会。 4. **...
- **UTF-8中文字符表.txt**:这个文件可能包含了使用UTF-8编码的所有中文字符,每个字符会以UTF-8编码的形式展示,通常用于验证程序对UTF-8编码的支持或进行字符编码教学。 - **unicode 汉字表.txt**:此文件很可能...
易语言UTF-8编码转换工具源码的分享,对学习易语言的初学者来说,是一个很好的实践案例,可以了解如何操作文件、读取和写入数据以及处理字符编码问题。 在处理编码转换时,通常会涉及到以下几个关键知识点: 1. **...
UTF-8编码是一种广泛使用的字符编码标准,它能够表示Unicode字符集中的所有字符。这个“utf-8码转换器”程序是用SWT(Standard Widget Toolkit)开发的,旨在帮助用户将非UTF-8编码的文本转换为UTF-8编码。在IT行业...
在IT行业中,emoj表情...总之,理解和处理emoj表情对应的utf-8编码是跨平台通信中的一项关键技术。通过正确的编码解码和映射机制,我们可以确保emoj在不同设备和系统间能够顺畅无误地传递,从而提升用户的沟通体验。