gpt4 book ai didi

java - 字符串编码转换 UTF-8 到 SHIFT-JIS

转载 作者:行者123 更新时间:2023-11-30 02:56:12 77 4
gpt4 key购买 nike

使用的变量:

  • JavaSE-6
  • 没有框架
<小时/>

给定此字符串输入 ピーター・ジョーズ它以 UTF-8 编码,我在将所述字符串转换为 Shift-JIS 时遇到问题,而无需将所述数据写入文件。

  • 输入(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 编码)

关于如何解决这个问题有什么想法吗?

最佳答案

在 Java 内部,字符串被实现为 UTF-16 代码单元的数组。但这是一个实现细节,可以实现内部使用不同编码的 JVM。

(注意“编码”、“字符集”和字符集或多或少是同义词。)

字符串应被视为 Unicode 代码点序列(即使在 Java 中它是 UTF-16 代码单元序列)。

如果 Java 程序中有一个字符串,说它是“UTF-8 字符串”或“以 UTF-8 编码的字符串”是不正确的。这没有任何意义,除非你谈论的是无关紧要的内部表示。

如果使用编码(例如 UTF-8 或 Shift-JIS)对其进行解码,您可以获得的是解码为字符串的字节序列。

或者,如果您使用某种编码(例如 UTF-8 或 Shift-JIS)对其进行编码,则可以将字符串编码为字节序列。

简而言之,编码或字符集是两个函数的对,“编码”和“解码”,这样:

// 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 控制台,它会使用很可能完全不同的编码(可能是 CP437CP850)将这些字节转换为字符串在将其呈现给您之前。

最后一部分可能会让您绊倒。

关于java - 字符串编码转换 UTF-8 到 SHIFT-JIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37155417/

77 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com