Java文件解析工具包设计,快速文件编码完整性检查

标签 java encoding utf-8 character-encoding utf-16

(免责声明:在提问之前我查看了这里的一些帖子,我发现this one特别有帮助,我只是想在可能的情况下向你们寻求一些健全性检查)

大家好,

我有一个内部 Java 产品,用于处理数据文件以加载到数据库中(也称为 ETL 工具)。我已经为 XSLT 转换预先准备好阶段,并在原始文件中执行诸如模式替换之类的操作。输入文件可以是任何格式,它们可以是平面数据文件或 XML 数据文件,您可以配置加载的特定数据源所需的阶段。

到目前为止,我一直忽略文件编码的问题(我知道这是一个错误),因为一切都工作正常(主要是)。然而,我现在遇到了文件编码问题,长话短说,由于阶段可以配置在一起的方式的本质,我需要检测输入文件的文件编码并使用以下命令创建一个 Java Reader 对象:适当的论据。我只是想在深入研究一些我无法声称完全理解的内容之前与你们进行快速的理智检查:

  1. 对我的工具包中每个阶段输出的所有文件采用 UTF-16 标准文件编码(我不排除将来加载双字节字符)
  2. 使用JUniversalChardetjchardet嗅探输入文件编码
  3. 使用 Apache Commons IO 库为所有阶段创建标准读取器和写入器(我的想法是否正确,这没有类似的编码嗅探 API?)

您在我概述的方法中看到任何陷阱/有任何额外的智慧可以提供吗?

有什么方法可以让我确信与使用现有方法加载的任何数据向后兼容,让 Java 运行时决定 windows-1252 的编码?

提前致谢,

-詹姆斯

最佳答案

对于平面字符数据文件,任何编码检测都需要依赖统计和启发法(例如 BOM 的存在,或字符/模式频率),因为有些字节序列在多种编码中都是合法的,但映射到不同的字符。

XML encoding detection应该更简单,但肯定有可能创建模糊编码的 XML(例如,通过省略 header 中的编码)。

使用编码检测 API 向用户指示错误概率可能比依赖他们作为决策者更有意义。

当您在 Java 中将数据从 byte 转换为 char 时,您正在从编码 X 转码为 UTF-16(BE) 。发送到数据库的内容取决于您的数据库、其 JDBC 驱动程序以及您配置列的方式。这可能涉及从 UTF-16 转码为其他内容。假设您不更改数据库,现有的角色数据应该是安全的;如果您打算解析 BLOB,您可能会遇到问题。如果您已经解析了以不同编码编写的文件,但将它们视为另一种编码,则损坏已经发生 - 没有 Elixir 可以解决这个问题。如果您需要将数据库的字符集从“ANSI”更改为 Unicode,则可能会得到 painful .

Adoption of Unicode尽可能是一个好主意。这可能不可能,但更喜欢可以使编码明确的文件格式 - 例如 XML(这使得编码变得容易)或 JSON(要求 UTF-8)。

关于Java文件解析工具包设计,快速文件编码完整性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2185692/

相关文章:

java - 从 Neo4j 2.1.7 升级到 2.2.0

Java,如何让程序等待视频结束然后继续,wait()使程序停止

java - Java 中拉丁字符的 URL 编码

json - 如何将 header 添加到 JSON 以识别数组值的数组名称

为 Ruby FFI 接口(interface)从字符串转换为 const char* 时的 C++ 字符编码

xml - 这是此 xml 文件中有效的 UTF8 字符吗?

mysql - 如何让 MySQL 识别 LIKE 和 REGEXP 中的多字节字符?

java - 正则表达式用于修复带有空格的断开链接

java - 在 Hibernate 3 上禁用透明持久化

pdf - 从 C/C++ 中的 True type 字体文件中以编程方式提取 Unicode 字符值