日文字的Java编码

问题描述 投票:2回答:3

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

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

输出 fileNameX 即将推出 S?最終条件.pdf. 因此,它抛出了一个错误。我试图将文件以PDF格式外流,但无法识别特定的日语字符"-",并且在流媒体时抛出错误。

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

java unicode utf-8 cjk
3个回答
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应该不需要转换就能出来。


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

0
投票

@josefx和@余孙玉米的回答都是收藏的。

首先,正如@josefx所回答的那样,当你想要一个字符串的Shift JIS表示法,并将其反转为一个 String 对象,你必须将相同的编码传递给 String#getBytes(String charsetName) 和构造函数 String(byte[] bytes, String charsetName).

其次,你必须使用 Windows-31J 而不是 Shift_JIS 作为编码名称。编码方案为 Windows-31JShift_JIS 是相同的,但字符集略有不同。Windows-31J有一些额外的字符(注意,Windows-31J在Windows文档中被称为 "Shift JIS"。所以在大多数情况下,您应该使用 Windows-31J 当你想使用Shift JIS)。) 正如@余孙玉米所回答的那样,字符串中的 "S-最終条件.pdf" 含有Shift JIS的字符集中没有的字符。. 在Windows-31J的字符集中包含了这个字符。

最后,你应该使用的代码将是这样的。

// Get the byte-stream representation of Japanese characters in Windows-31J encoding.
// Windows-31J (aka MS932) is the default encoding when you run Java VM in Windows with Japanese locale.
byte [] textBytes = name.getBytes("Windows-31J");

// Reverse byte-stream representation to a String object
System.out.println(new String(textBytes, "Windows-31J"));
© www.soinside.com 2019 - 2024. All rights reserved.