`
xiaosunzhu
  • 浏览: 7857 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

Java配置文件Unicode编码可能引发的bug

 
阅读更多

发现bug

在服务器上部署后台服务并验证能够正常运行,但是一次修改配置重启后突然出现了一个空指针bug,部署的程序并没有改变

 

2.    定位bug

空指针定位到一个变量,查找代码发现变量初始化来自于读取配置文件,但是检查配置文件中有正常配置相应值,所以无法找到原因。

后来在开发机器上调试服务都没有问题,只好重新部署服务到服务器,发现是能够正常运行。

比较两次部署的服务包,内容完全一致,唯独配置文件的二进制不同,使用十六进制查看配置文件,发现文件开头多出了3个字节的BOM头。

 

3.    解决bug

使用文本编辑工具将配置文件的BOM头去掉后,重新启动服务,验证能够正常运行。

 

4.    分析bug

  • Bug产生的原因:Windows系统对Unicode编码的文本文件会使用BOM头来定义编码方式和字节序,如果使用记事本编辑Unicode文件保存后就会默认添加BOM头。而Java的原生IO并不会处理BOM头,会将BOM头视为普通内容,JDK Bug中有此记录,详见JDK Bug 4508058,结论是该Bug不会修复,为了更好的适应性。
  • Bug的避免:
    • 建议不使用Unicode编码的配置文件,有些IDE默认都是ISO8859-1,这样兼容性最好。
    • Windows系统上编辑文本文件需要使用编辑工具,不要默认使用记事本,编辑要注意BOM头问题。
    • 为使程序兼容性更好,读取文件时程序应识别并去掉BOM头。已提供读取配置文件工具,源码详见UnicodeInputStream
    • 下载resource-utils或者可以引入maven依赖库

        <groupId>net.sunyijun</groupId>

        <artifactId>resource-utils</artifactId>

使用该工具库读取配置可以兼容BOM头。具体用法详见README

 

BOM头规则:

00 00 FE FF = UTF-32, big-endian

FF FE 00 00 = UTF-32, little-endian

EF BB BF = UTF-8,

FE FF = UTF-16, big-endian

FF FE = UTF-16, little-endian

4
0
分享到:
评论

相关推荐

    java乱码问题解决方法

    Tomcat 5.5 中文乱码问题可以通过修改配置文件和使用 Filter 来解决。例如,可以在 web.xml 文件中添加以下代码: ```xml &lt;filter-name&gt;Set Character Encoding &lt;filter-class&gt;filters....

    mysql-connector-java-8.0.13.jar

    9. **配置选项**:开发者可以通过连接URL或配置文件设置各种参数,以调整连接行为,例如设置超时、启用或禁用自动重连、指定默认的字符集等。 10. **异常处理**:当数据库操作失败时,MySQL Connector/J会抛出相应...

    java web 开发乱码汇总

    Java本身在设计上采用了统一的Unicode编码标准,即在文件存储、编译以及JVM运行时均采用Unicode编码。然而,在实际的应用场景中,客户端和服务端之间可能存在编码方式不一致的情况,这就需要开发者采取措施确保编码...

    25个让Java程序员更高效的Eclipse插件

    10. Eclipse-rbe:Eclipse-rbe是一款用于编辑Java文件的插件,能够提供缺失变量的警告、键值排序和Unicode编码转换等功能。 11. ApacheIvyDE:这个插件集成了Apache Ivy的依赖管理功能,能够管理项目中的依赖关系,...

    桌面动态壁纸

    5. **AndroidManifest.xml**:这是每个Android应用的核心配置文件,声明应用的组件、权限和其他重要属性,包括动态壁纸服务的注册。 6. **GB编码**:GB编码是中国国家标准的汉字编码,与Unicode(UTF-8)相比,其对...

    手机 pdf 阅读器

    (对于大部分JAR电子书都,可以从文件管理器中找到非.class结尾的文件,并且选择打开为UNICODE/TXT阅读) (对于NOKIA手机及其它部分手机,由于安全策略的限制,在Anyview的文件管理器中无法查看后缀为.jar的文件) ...

    jtds 1.2.4

    - `conf`目录:可能包含了一些示例配置文件或默认设置,帮助用户配置驱动参数。 - `x86`目录:可能包含特定于32位系统的库或资源,如果驱动需要的话。 - `html`目录:可能包含帮助文档或者用户手册的HTML格式版本。 ...

    1.1.sonar配置使用1

    在处理含有中文字符的路径时,需要确保系统和SonarQube支持Unicode编码,以防止乱码发生。可能需要调整文件系统的编码设置,或者在运行SonarQube分析时提供适当的编码参数。 SonarQube的汉化插件`sonar-l10n-zh-...

    NotePad2 MOD-v1.1.1.2 (简/繁/英)

    1、修正 "for %%" 字串(在“批处理文件”语法高亮方案下)可能导致程序出错的 bug; 2、添加状态栏的编码部分双击切换编码格式,右击弹出编码格式选择菜单; 3、添加默认编码格式在常规设置页面中; 4、添加一个 ...

    lerx_utf8_v_beta_0111毕业设计—(包含完整源码可运行).rar

    7. **项目结构**:压缩包内的文件和目录结构通常反映出项目代码的组织方式,如源代码、资源文件、配置文件等。 8. **时间线管理**:从两个不同版本的时间戳来看,项目经历了至少一次迭代,反映了软件开发中的持续...

    ]盈盈通JSP网络聊天软件

    至于压缩包内的文件列表,虽然没有具体给出,但通常会包含JSP文件、Java源代码、样式表(CSS)、图像资源、JavaScript文件以及可能的配置文件。这些文件共同构成了盈盈通JSP网络聊天软件的完整框架。开发者可能使用...

    jtds驱动

    - **conf**目录:可能包含示例配置文件或驱动相关的配置信息。 - **html**目录:可能包含用户手册或其他文档的HTML版本。 - **XA**目录:可能涉及与X/Open XA相关的资源,这对于处理分布式事务是必要的。 5. **...

    MYSQL字符集与乱码问题分析

    通过修改my.cnf或my.ini配置文件中的`character_set_server`和`collation_server`参数,可以全局设置MySQL的字符集和排序规则。使用`SHOW VARIABLES LIKE 'char%'`命令可查看当前配置。 #### 字符集相关BUG分析 ...

    Advanced GUI(解决了汉字显示问题)

    解决这类问题通常需要深入理解Unicode编码标准、字形渲染以及操作系统如何处理文本显示。 在修复这个bug的过程中,开发者可能涉及以下几个关键知识点: 1. **字符编码**:理解Unicode和各种变种,如UTF-8、GBK等,...

    代码编辑器Notepad-V8.4.6

    7. **Unicode支持**:Notepad++支持Unicode和UTF-8编码,确保了跨语言文件的正确处理。 8. **自定义工具**:用户可以设置自定义的外部工具,例如编译器、解释器或者版本控制系统,将这些工具集成到Notepad++中,...

    notepad++的相关使用说明

    3. **配置文件编辑**:修改系统或应用程序的配置文件时,Notepad++的编码转换和文本搜索功能十分便捷。 4. **批量文本处理**:结合宏和正则表达式,可以实现批量文本替换和格式化,大大节省时间。 总之,Notepad++...

    SciTE V1.76

    - **编码支持**:支持多种字符编码,包括ASCII、Unicode等。 - **可定制性**:用户可以通过配置文件调整编辑器的主题、快捷键、语言设置等。 **3. V1.76版本更新** - **性能优化**:新版本通常会针对性能进行优化,...

    sqlserver驱动包 jtds-1.3.1.jar

    1. 添加依赖:将jtds-1.3.1.jar文件复制到项目库或指定的类路径中,确保在运行时能够被Java虚拟机找到。 2. 配置连接参数:创建一个DataSource或Connection对象时,需要提供服务器地址、端口、数据库名、用户名和...

    EditPlus 3.31 Build 1129

    * -pi 命令行选项指定了不同的工程配置文件 * 字符串插入支持 Perl 语法加亮 * 单词 (文字) 加亮现在支持选择不同的单词 (文字) * 新增“恢复默认值”按钮 (在字体对话框) * 在颜色拾取器显示颜色代码 * 添加“使用...

    notepad++健康版本(windows x64.8.4.7)

    7. **编码格式转换**:Notepad++支持多种编码格式,如ASCII、UTF-8、Unicode等,方便处理不同编码的文件。 8. **自动完成**:提供一定程度的代码自动完成功能,提高编程效率。 9. **宏录制和回放**:用户可以录制...

Global site tag (gtag.js) - Google Analytics