我有一个带日文字符的文件名。文件名:S-最終条件.pdf
。在Java中,文件名为:S-最終条件.pdf
。
// Support for Japanese file name
fileNameX = new String(fileName.getBytes("Shift_JIS"),"ISO8859_1");
输出fileNameX
即将出现S?最終条件.pdf
。因此它抛出了一个错误。我试图以PDF格式对文件进行流出,但是特定的日文字符“ - ”无法识别,并且在流式传输时会抛出错误。
请帮我解决这个问题。
谢谢,Prasanna
答案 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_JIS
和Windows-31J
的编码方案相同,但字符集略有不同:Windows-31J还有一些其他字符(请注意,Windows文档中的Windows-31J被称为“ Shift JIS”。因此,在大多数情况下,要使用Shift JIS时应使用Shift_JIS
。正如@Yu Sun corn回答的那样,字符串Windows-31J
包含Shift JIS字符集"S-最終条件.pdf"
中未包含的字符。 Windows-31J的字符集包含此字符。
最后,您应该使用的代码将如下所示:
-