gpt4 book ai didi

java - Java 与 C# 中不同的 UTF-16 编码

转载 作者:搜寻专家 更新时间:2023-11-01 02:23:00 24 4
gpt4 key购买 nike

在 C# 和 Java 中将字符串转换为字节时,我遇到了不同的结果。

C#:

byte[] byteArray =  Encoding.Unicode.GetBytes ("chess ¾");
for (int i = 0; i < byteArray.Length; i++)
System.Diagnostics.Debug.Write (" " + byteArray[i]);
System.Diagnostics.Debug.WriteLine("");
System.Diagnostics.Debug.WriteLine(Encoding.Unicode.GetString(byteArray));

显示:

99 0 104 0 101 0 115 0 115 0 32 0 190 0
chess ¾

Java:

byte[] byteArray = "chess ¾".getBytes("UTF-16LE");
for (int i = 0; i < byteArray.length; i++)
System.out.print(" " + (byteArray[i]<0?(-byteArray[i]+128):byteArray[i]));
System.out.println("");
System.out.println(new String(byteAppName,"UTF-16LE"));

显示:

99 0 104 0 101 0 115 0 115 0 32 0 194 0
chess ¾

请注意,字节数组中的倒数第二个值不同!我的目标是加密此数据并能够从 C# 或 Java 读取它。这种差异似乎是一个障碍。

附带说明一下,在我学习使用 Unicode(C#)/UTF-16LE(Java) 之前,我使用的是 UTF-8 ...

C#: byte[] byteArray = Encoding.UTF8.GetBytes ("chess ¾");

显示: 99 104 101 115 115 32 194 190

Java: byteArray = appName.getBytes("UTF-8");

显示: 99 104 101 115 115 32 190 194

这奇怪地导致倒数第二个和最后一个字节被翻转。

最后,¾ 的 Unicode 是十进制的 190 (http://www.fileformat.info/info/unicode/char/BE/index.htm),而不是十进制的 194 (Â) (http://www.fileformat.info/info/unicode/char/00c2/index.htm)。

如有任何帮助,我们将不胜感激。

最佳答案

您的问题不在于编码,而在于您打印结果的方式,您正在使用 byteArray[i] < 0 ? (-byteArray[i] + 128) : byteArray[i] 从字节转换为整数。这会给你不正确的结果,使用其他类似 byteArray[i] & 0xFF 的东西反而。使用此 poc 比较两种转化:

    String encoding = "UTF-16LE";
byte[] byteArray = "chess ¾".getBytes(encoding);
for (int i = 0; i < byteArray.length; i++) {
// your conversion
System.out.print(" " + (byteArray[i] < 0 ? (-byteArray[i] + 128) : byteArray[i]));
// a more appropriate one
System.out.print("(" + (byteArray[i] & 0xFF) + ") ");
}
System.out.println("");
System.out.println(new String(byteArray, encoding));

关于java - Java 与 C# 中不同的 UTF-16 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34167777/

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