java - 将 0x00 等 unicode 字符转换为字节

标签 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 数组有 17 个元素,而 C# 中有 16 个元素。

差异在于字节数组的第一个元素:

Java:

不幸的是,这种差异可能会在以后引起问题,因为该数组正在发送到另一个 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/

相关文章:

c# - SqlCommand 如果存在 - 更新,如果不存在 - 插入

javascript - 如何将此字符串转换为普通的 utf-8 字符串

java - 在 Java 中使用 UNICODE 符号时出现问题

Java序列化问题

java - 如何在靶心动画中正确实现 Action 监听器

java - 我如何使用 powermock stub Instant 对象

php 到 rtf,é 变成 É

java - hibernate :PSQLException:错误:列 “this_.user_id” 不存在

C# 括号返回 null

c# - 一个简单的 Wpf MVVM 绑定(bind)问题