Java 和 C 是否以相同的方式表示 UTF 字符字节?

Do Java and C represent a UTF char byte in the same way?

我正在将字节数组从 Java 传递到 C,我认为 Java 和 C 以相同的方式表示 UTF 字符字节。

我可以这样做吗:

jbyte *bytePtr = (*env)->GetByteArrayElements(env, javaByteArray, NULL);

// javaByteArray has java bytes for the UTF chars: 'A', 'B', 'C'

unsigned char *bytePtrC = (unsigned char *) bytePtr;

printf("%c %c %c \n", bytePtrC, bytePtrC+1, bytePtrC+2);

// will this print A B C ?

没有

二进制 字节数组呈现数据,如两个短裤将是相同的。

正文另当别论。 Java 在 Unicode 中设计为 text (String, char),而 char 是一个两字节的 UTF-16 值。总是存在从 byte[]String 的转换,其中包含要使用的那些字节的一些编码。

所以 java:

byte[] bytes = string.getBytes(StandardCharsets.UTF_8);

这几乎是一个 C 数组,但存在以下差异:

  • bytes.length 作为字段
  • C 有一个额外的终止空字符:'[=14=]'
  • java 字符串可能包含空字符;一些 类 (DataOutputStream.writeUTF8) 也将以多字节序列对其进行编码,以实现与 C 字符串的互操作性。 这叫做修改后的UTF-8.

但是没有真正的问题。只保证:

  • 使用 String.getBytes(StandardCharsets.UTF_8) 而不是 String.getBytes()
  • 使用 new String(bytes, StandardCharsets.UTF_8) 代替 new String(bytes)
  • 永远不要像使用 C unsigned char* 那样对二进制数据使用 String 和 char。它会使用两倍的内存,来回转换缓慢可能会损坏数据。
  • 关于二进制数据(ByteBuffer.order): short, int, long等在java.
  • 中是big-endian

由于后面的版本使用的是平台的默认编码,不可移植