我正在尝试将小型库从 Java 移植到 C#。 我在将 unicode 字符串转换为字节期间遇到问题。这可以通过以下代码片段显示:
import java.io.*;
public class Test {
public static void method(String x){
System.out.println(x);
byte[] bytes = x.getBytes();
for (byte z : bytes) {
System.out.println(z);
}
System.out.println("Array length: "+bytes.length);
}
public static void main(String args[]) {
method(""+(char)0xEE+(char)0x00+"testowy wydruk");
}
}
这将做三件事:
- 打印字符串
- 获取字节
- 打印该数组+它的长度
我将此代码段重写为 C#:
string x = "" + (char)0xEE + (char)0x00 + "testowy wydruk";
Console.WriteLine(x);
byte[] d = System.Text.Encoding.ASCII.GetBytes(x);
foreach(byte z in d)
{
Console.WriteLine(z);
}
Console.WriteLine("Array length: "+d.Count());
不知道为什么 Java 数组有 17 个元素,而 C# 中有 16 个元素。
差异在于字节数组的第一个元素:
不幸的是,这种差异可能会在以后引起问题,因为该数组正在发送到另一个 API。
最佳答案
(char)0xEE
是 î
,又名 Unicode Character 'LATIN SMALL LETTER I WITH CIRCUMFLEX' (U+00EE) ,编码为 UTF-8 为 0xC3 0xAE
,又名 -61 -82
。
您的 Java 代码没有指定您想要字节采用哪种编码,因此 Java 显然会为您转换为 UTF-8(默认值因安装而异)。
您在 C# 代码中显式指定了 ASCII
,因此 EE
字符被转换为 ?
,又名 0x3F
> 又名 63
,因为 ASCII 中没有这样的字符。
如果您将 Java 代码更改为使用 getBytes("ASCII")
或getBytes(StandardCharsets.US_ASCII)
,那么你会得到与 C# 相同的结果。
关于java - 将 0x00 等 unicode 字符转换为字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55342440/