我正在尝试使用一些日文文本读取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编码本身......)它可能是?
答案 0 :(得分:0)
经过一些研究和尝试\失败迭代后,我注意到如果我指定“JISAutoDetect”而不是“Shift-JIS”作为InputStreamReader的参数 - 那么所有的汉字字符都会变得可读。
根据我发现here的描述,JISAutoDetect应该执行以下操作:“检测并转换自Shift-JIS,EUC-JP,ISO 2022 JP(仅转换为Unicode)”。所以它的工作做得很好。
从那里我可以看到一些后果:
1)从JISAutoDetect描述我可以假设,理论上可能的是,我所拥有的文件编码 - 实际上并不是Shift-JIS。这就是为什么在从Shift-JIS文件中读取数据之后我拥有所有这些乱码的原因。如果它是,例如,EUC-JP,那么JISAutoDetect检测到这一点并正确地转换了所有内容。
但是我从客户端获得了这个文件,日文版的Windows应该有本机编码的Shift-JIS(至少我的客户端断言)。此外,我尝试使用在线转换工具将存储在UTF-8编码文件中的相同字符转换为Shift-JIS。在通过我的代码后,这给了我相同的乱码。
2)因此,如果上面的所有内容都是正确的,那么在Java中处理Shift-JIS文件可能会有一些错误。虽然很难相信这一点。