我正在尝试将小型库从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 Array中有17个元素,而在C#中为什么有16个元素。
区别在于字节数组的第一个元素:
不幸的是,这种差异稍后可能会导致问题,因为此数组正被发送到另一个api。
答案 0 :(得分:2)
(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#相同。