将Unicode字符(如0x00)转换为字节

时间:2019-03-25 16:32:54

标签: java c# unicode encoding

我正在尝试将小型库从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");

   }
}

这将做三件事:

  1. 打印字符串
  2. 获取字节
  3. 打印该数组及其长度

我将此代码段重写为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个元素。

区别在于字节数组的第一个元素:

Java:

不幸的是,这种差异稍后可能会导致问题,因为此数组正被发送到另一个api。

1 个答案:

答案 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#相同。