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
由于后面的版本使用的是平台的默认编码,不可移植
我正在将字节数组从 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
由于后面的版本使用的是平台的默认编码,不可移植