日语字符的Java编码

时间:2011-03-03 04:44:58

标签: java unicode utf-8 cjk

我有一个带日文字符的文件名。文件名:S-最終条件.pdf。在Java中,文件名为:S-最終条件.pdf

// Support for Japanese file name
fileNameX = new String(fileName.getBytes("Shift_JIS"),"ISO8859_1");

输出fileNameX即将出现S?最終条件.pdf。因此它抛出了一个错误。我试图以PDF格式对文件进行流出,但是特定的日文字符“ - ”无法识别,并且在流式传输时会抛出错误。

请帮我解决这个问题。
谢谢,Prasanna

3 个答案:

答案 0 :(得分:2)

让我们看看你的代码实际上做了什么:

//Assign to bytes the UTF-16 String fileName Encoded in Shift_JIS
//bytes now contains the binary Shift_JIS representation of your String
final byte[] bytes = fileName.getBytes("Shift_JIS");

//Create a new String UTF-16 by interpreting bytes as ISO8859_1
//Takes the Shift_JIS encoded bytes and interprets it as ISO8859_1
new String(bytes,"ISO8859_1");

Java字符串使用UTF-16作为其内部表示。创建字符串时无法指定目标编码,因为UTF-16已修复,您必须为字节数组指定正确的源编码“Shift_JIS”。

fileNameX应该正确无需转换。

答案 1 :(得分:0)

这是Shift_JIS代码和Unicode的映射问题。 Shift_JIS没有Unicode的所有字符,因此某些字符变为“?”。

以下是从Unicode转换为Shift_JIS的结果。

RESULT  UNICODE
[NG]    U+2012 (FIGURE DASH)
[NG]    U+2013 (EN DASH)
<OK>    U+2014 (EM DASH)
[NG]    U+2015 (HORIZONTAL BAR)
<OK>    U+2212 (MINUS SIGN)
[NG]    U+FF0D (FULLWIDTH HYPHEN-MINUS)

一种解决方案是替换代码。

U+2012,U+2013,U+2015 --> U+2014
U+FF0D               --> U+2212

答案 2 :(得分:0)

@josefx和@Yu Sun corn的答案都被收集了。

首先,正如@josefx回答的那样,当您想要字符串的Shift JIS表示形式并将其反转为String对象时,必须将相同的编码传递给String#getBytes(String charsetName)和构造函数{{ 1}}。

第二,您必须使用String(byte[] bytes, String charsetName)而不是Windows-31J作为编码名称。 Shift_JISWindows-31J的编码方案相同,但字符集略有不同:Windows-31J还有一些其他字符(请注意,Windows文档中的Windows-31J被称为“ Shift JIS”。因此,在大多数情况下,要使用Shift JIS时应使用Shift_JIS。正如@Yu Sun corn回答的那样,字符串Windows-31J包含Shift JIS字符集"S-最終条件.pdf"中未包含的字符。 Windows-31J的字符集包含此字符。

最后,您应该使用的代码将如下所示: