使用的变量:
鉴于此ピーター・ジョーズ
的字符串输入以 UTF-8 编码,我无法将所述字符串转换为 Shift-JIS 将所述数据写入文件。
ピーター・ジョーンズ
ピーター・ジョーンズ
(要编码的SHIFT-JIS)我已尝试过如何将UTF-8字符串转换为SHIFT-JIS的代码片段:
stringToEncode.getBytes(Charset.forName("SHIFT-JIS"))
new String(unecodedString.getBytes("SHIFT-JIS"), "UTF-8")
两个代码段都返回此字符串输出:�s�[�^�[�E�W���[���Y
(SHIFT-JIS编码)
关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
在Java内部,字符串是作为UTF-16代码单元的数组实现的。但这是一个实现细节,可以实现一个内部使用不同编码的JVM。
(注意“编码”,“charset”和Charset或多或少是同义词。)
应将String视为一系列Unicode代码点(即使在Java中它是一系列UTF-16代码单元)。
如果您的Java程序中有一个字符串,那么不正确表示它是“UTF-8字符串”或“以UTF-8编码的字符串”。这没有任何意义,除非你在谈论内部表示,这是无关紧要的。
如果使用编码(例如UTF-8或Shift-JIS)对字符串进行解码,则可以使用的字节序列解码为字符串。
或者,如果使用编码对其进行编码,则可以使用编码为字节序列的String,例如UTF-8或Shift-JIS。
简而言之,编码或Charset是一对两个函数,“编码”和“解码”,这样:
// String -> encode -> bytes
byte[] bytes = string.getBytes(encoding);
// or using Charset
ByteBuffer byteBuffer = charset.encode(string);
// bytes -> decode -> String
String string = new String(bytes, encoding);
// or using Charset
String string = charset.decode(byteBuffer).toString();
所以如果你有一个使用UTF-8编码的byte []:
byte[] utf8Bytes = "ピーター・ジョーズ".getBytes("UTF-8");
// utf8Bytes now contains, in hexadecimal
// e3 83 94 e3 83 bc e3 82 bf (ピ ー タ)
// e3 83 bc e3 83 bb e3 82 b8 (ー ・ ジ)
// e3 83 a7 e3 83 bc e3 82 ba (ョ ー ズ)
您可以使用以下命令从这些字节创建字符串:
String string = new String(utf8Bytes, "UTF-8");
// String now contains "ピーター・ジョーズ"
然后您可以使用以下命令将该字符串编码为Shift-JIS:
byte[] shiftJisBytes = string.getBytes("Shift-JIS");
// shiftJisBytes now contains, in hexadecimal
// 83 73 81 5b 83 5e (ピ ー タ)
// 81 5b 81 45 83 57 (ー ・ ジ)
// 83 87 81 5b 83 59 (ョ ー ズ)
由于这些字节表示使用Shift-JIS
编码的字符串,因此尝试使用UTF-8
进行解码会产生垃圾:
String garbage = new String(shiftJisBytes, "UTF-8")
// String now contains "�s�[�^�[�E�W���[�Y"
// � is the character decoded when given an invalid UTF-8 sequence
// 83 73 81 5b 83 5e (� s � [ � ^)
// 81 5b 81 45 83 57 (� [ � E � W)
// 83 87 81 5b 83 59 (� � � [ � Y)
此外,请记住,如果将字符串打印到输出(例如System.out
),则将使用系统相关的系统默认编码将字符串转换为字节。您的系统默认值似乎为UTF-8
。
System.out.print(string);
// equivalent to:
System.out.write(string.getBytes(Charset.defaultCharset()));
然后,如果您的输出是例如Windows控制台,那么在将它们呈现给您之前,它将使用非常可能完全不同的编码(可能是CP437
或CP850
)将这些字节转换为字符串。
这最后一部分可能会让你失望。
答案 1 :(得分:0)
" MS932"而不是Shift-JIS / SJIS可能会成功。