`
yuanc00
  • 浏览: 29369 次
社区版块
存档分类
最新评论

跨平台UTF-8编码问题

    博客分类:
  • java
 
阅读更多

跨平台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编码互转,一个头文件搞定!跨平台不使用第三方库

    UTF-8编码和GBK编码互转,一个头文件搞定!跨平台不使用第三方库。只需要添加一些C语言标准的头文件即可实现俩种编码互相转换。摆脱第三方库移植问题。原理是将UTF-8编码的汉字、字母、符号、数字等转换成unicode...

    EasyTcpServer-优化线程-跨平台兼容-utf8 bom字符编码.zip

    EasyTcpServer-优化线程-跨平台兼容-utf8 bom字符编码

    utf8 转为 gbk 编码

    可以帮助你把中文转换成UTF-8编码形式,UTF-8编码与中文互转,同时也支持把UTF-8编码过的字符还原成中文,将字符串转换为UTF-8形式,解决在网络传输过程中出现的字符乱码,同时可跨平台使用。

    c++utf-8 库更新 1.1版本,支持跨平台版本( WINDOW / LINUX )

    utf-8 库,包括ascString ucsString utfString utfCount utf8_ucs2_t utf8_ucs4_t等,更新后提供LIB和.a文件两个类库,支持跨平台

    UTF-8互转GBK

    UTF-8 GBK 转化工具 C++ 源代码编码转化 主要用于跨平台的源代码编译,防止乱码

    c/c++ 字符集 gbk/utf8互转,Ansi/Utf8互转 纯c实现跨平台

    跨平台(windows Linux)是纯c实现 gbk/utf8互转,Ansi/Utf8互转,

    iconv 跨平台编码转换库

    iconv是知名的开源跨平台编码转换库,iconv.exe是iconv库在windows下的命令行工具,iconv.exe的一般用法:iconv.exe -f gbk -t utf-8 gbk.txt > utf-8.txt。其中 -f gbk 指明转换前的文件编码是gbk,-t utf-8 指明...

    UTF-8和GB2312网页编码

    最近有好多学生问我网页的编码问题,gb2312和utf-8编码有什么区别呢?今天总结下。 最近有好多学生问我网页的编码问题,gb2312和utf-8编码有什么区别呢?今天总结下:  不知道大家在做页面的时候会不会遇到样式定义...

    VeryIDE Bee 互动营销平台 v1.4 UTF-8.rar

    修正 专题系统"小挂件"图片不能正常显示的问题 修正 抽奖系统用户参与次数无效的问题 修正 JSON 转换时在 UTF8 编码下出错的问题 修正 金币竞拍若干问题,涉及二级域名,金币数量和样式等等 修正 金币竞拍倒计时计算...

    文件编码识别和转换工具PythonCoCo.zip

    CoCo(Code Convert) 是一个简单的文件编码识别和转换的命令行工具,使用python编写,具有很好的跨平台特性。安装$ pip install cocov 或者源码安装 $ git clone git@github.com:buptmiao/CoCo.git  $ cd...

    网页制作与CSS的UTF-8和GB2312编码问题

    大家都知道使用“UTF-8”比“GB2312”跨平台的兼容性更好,却不一定知道文件的编码跟文件编码的申明不是一回事,以为只要申明了文件的编码类型就是改了文件的编码,导致很多时候只是简单的申明了文件的编码类型,而...

    跨平台编码转换类

    跨平台编码转换类,能再unicode、多字节编码和utf-8之间相互转换,并且是跨平台的。

    基于Indy兼容 Delphi7 - Delphi 10.3 环境的 MQTT 组件,支持 win 和 android 跨平台

    基于原作者“毒手药王”设计的模块二次修改与... 使用 utf-8 编码,改善兼容性 增加 Unscribe 操作 增加 CleanSession 设置 增加 ConnectionTimeout 功能 具备自动发送 Ping 报文保持连接 具备断线自动重新连接

    nowide-standalone:该库提供了标准C和C ++库函数的实现,因此它们的输入为UTF-8,在Windows上就可识别,而无需Wide API

    不广 Linux / GCC Windows / MSVC 二进制文件 --- NoWide是最初由Artyom Beilis实现的库,它使跨平台,支持Unicode的编程... 在现代POSIX系统(Linux,Mac OSX,Solaris,BSD)上,文件名内部编码为UTF-8。 在这

    跨平台Smtp邮件发送工程

    SMTP发送邮件,支持SSL和TLS,可以跨平台,UTF-8,base64编码,可发送附件 vs工程默认使用的是vs2017,默认依赖的OpenSSL为vs2017编译的x64库 qt工程可以跨平台,windows环境下,默认依赖的OpenSSL也为vs2017编译的x64...

    深入分析Java中的中文编码问题

    编码问题一直困扰着开发人员,尤其在Java中更加明显,因为Java是跨平台语言,不同平台之间编码之间的切换较多。本文将向你详细介绍Java中编码问题出现的根本原因,你将了解到:Java 中经常遇到的几种编码格式的区别...

    Java中的String类getBytes()方法详解与实例

    通过实例和代码演示了使用平台默认字符编码和指定UTF-8、ISO-8859-1字符编码的情况。getBytes()方法在处理字符串和字节数据之间的转换时非常有用,特别是在跨平台和处理不同字符集的情况下。记得在使用指定字符编码...

    Aptana_Studio_Setup_2.0.5

    Aptana Studio支持中文的方法 : 在Windows 菜单 → Preferences → General → Content Types, 选择 Text ,在下方指定默认编码为UTF-8, 并在File associations下面添加文件类型,如 *.js ! 如果文档的编码不是...

    C#、java 字符流跨平台数据解压缩

    字符串采用UTF-8编码获得byte数组,保证两端通用,如果应用对编码有要求,两端同时改为其他编码方式也可以 从Java和C#的代码看,两者代码上有细微差别,但是思路方面两者基本是一样的 另外一个备忘,Java里边,...

    GuiLite全平台GUI库源码,基于C和C++开发.rar

    - 支持多语言,采用 UTF-8 编码;支持视频播放 - [资源制作工具]为你定制自己的字体/图片资源 - [所见即所得的GUI布局工具] - 完美的“云” + “物联网”解决方案 - 编译活跃度统计,及实时分析 - 支持3D & [Web] - ...

Global site tag (gtag.js) - Google Analytics