java - 将日语汉字字符从 Shift-JIS 转换为 UTF-8

标签 java apache-flex utf-8 character-encoding shift-jis

我正在尝试读取包含一些日语文本的 CSV 文件,并将该文件中的一些数据写入数据库。 CSV 是通过一些我不太熟悉的 Flex 代码上传的。但在我的后端,我有简单的 byte[] 和文件内容。我正在使用以下代码:

//content is an array of bytes, returned by Flex side
ByteArrayInputStream in = new ByteArrayInputStream(content);
BufferedReader br = new BufferedReader(new InputStreamReader(in, Const.ENCODING_SHIFT_JIS));
String strLine;
try {
    while (true) {
    strLine = br.readLine();
    //processing CSV line by line and eventually writing data to DB
...

当我调试 strLine 变量时 - 我只看到问号而不是日文汉字字符(特别是,我已经在日文汉字字符裵上测试了它)。其他日语字符似乎没问题(例如〒字符)。在调试窗口中(以及后来在我的数据库中),它看起来像这样: 〒���

如果我做同样的事情,但在我的代码中使用 UTF-8 和 Const.UTF-8 而不是 Const.ENCODING_SHIFT_JIS 编码的文件 - 一切正常。但客户端需要 Shift-JIS 支持。 也许有人可以告诉我如何解决这个问题,或者至少在哪个特定领域(flex、java、shift-jis 编码本身......)?

最佳答案

经过一些研究和尝试\失败迭代后,我注意到如果我指定“JISAutoDetect”而不是“Shift-JIS”作为 InputStreamReader 的参数 - 那么所有汉字字符都将变得可读。

根据我找到的描述here ,JISAutoDetect 应执行以下操作:“检测并从 Shift-JIS、EUC-JP、ISO 2022 JP 进行转换(仅转换为 Unicode)”。所以它做得很好。

从那里我可以看到一些后果:

1) 从 JISAutoDetect 描述中我可以假设,理论上我的文件编码是可能的 - 实际上不是 Shift-JIS。这就是为什么我从 Shift-JIS 文件中读取数据后出现所有这些乱码的原因。例如,如果是 EUC-JP,则 JISAutoDetect 会检测到这一点并正确转换所有内容。

但是我从使用日语版 Windows 的客户端获得了此文件,该文件应该具有 native 编码 Shift-JIS(至少我的客户端如此断言)。我还尝试使用在线转换工具将 UTF-8 编码文件中存储的相同字符转换为 Shift-JIS。在通过我的代码后,这给了我同样的乱码。

2) 因此,如果上述所有内容都是正确的,那么在 Java 中处理 Shift-JIS 文件时可能存在一些错误。尽管很难相信这一点。

关于java - 将日语汉字字符从 Shift-JIS 转换为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31033241/

相关文章:

java - 用于编译代码的简单 ant 脚本找不到 lib

c++ - QT 不识别 UTF-8 编码,在所有其他地方都有效

java - Spring Boot - 忽略属性 server.contextPath

apache-flex - 使用Youtube AS3 Chromeless Player的安全性错误

flash - 柔性 socket 连接

.NET 和 AMF

php - 无法使用 ' 正确搜索数据库

vb.net - 用VB.NET逐行读取文件

c# - 当逻辑基本相同时可以复制和粘贴单元测试吗?

java - 从父类(super class)实例创建实例