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

Convert Japanese Kanji characters from Shift-JIS to UTF-8

我正在尝试读取带有一些日语文本的 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 变量时 - 我只看到问号而不是日文汉字字符(特别是,我在汉字字符裵上测试过)。其他日语字符似乎还可以(例如〒字符)。在调试 window 中(后来在我的数据库中)它看起来像这样: 〒����

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

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

根据我发现的描述 here,JISAutoDetect 应该执行以下操作:"Detects and converts from Shift-JIS, EUC-JP, ISO 2022 JP (conversion to Unicode only)"。所以它的工作做得很好。

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

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

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

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