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

Java和C是否以相同的方式表示UTF字符字节?,java,c,java-native-interface,utf,Java,C,Java Native Interface,Utf,我将一个字节数组从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; p

我将一个字节数组从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的文本(字符串,字符),
char
是一个两字节的UTF-16值。始终存在从
byte[]
String
的转换,并使用这些字节的某些编码

在java中有这样一个例子:

byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
这几乎是一个C数组,但有以下区别:

  • 字节。长度为字段
  • C有一个额外的终止nul字符:
    '\0'
  • java字符串可以包含nul字符;某些类() 也将以多字节序列对其进行编码,以实现与C字符串的互操作性。 这称为改进型UTF-8
但没有真正的问题。仅确保:

  • 使用
    String.getBytes(StandardCharsets.UTF_8)
    而不是
    String.getBytes()
  • 使用
    新字符串(字节,StandardCharsets.UTF_8)
    而不是
    新字符串(字节)
  • 永远不要对二进制数据使用字符串和字符,因为人们会使用C
    无符号字符*
    。它将使用两倍的内存,来回的缓慢转换可能会损坏数据
  • 关于二进制数据(
    ByteBuffer.order
    ):short、int、long等是java中的大端数据
由于后一版本使用平台的默认编码,因此不可移植。

否。

表示数据的二进制字节数组(如两个短路)是相同的

文本是另一回事。Java设计时使用Unicode的文本(字符串,字符),
char
是一个两字节的UTF-16值。始终存在从
byte[]
String
的转换,并使用这些字节的某些编码

在java中有这样一个例子:

byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
这几乎是一个C数组,但有以下区别:

  • 字节。长度为字段
  • C有一个额外的终止nul字符:
    '\0'
  • java字符串可以包含nul字符;某些类() 也将以多字节序列对其进行编码,以实现与C字符串的互操作性。 这称为改进型UTF-8
但没有真正的问题。仅确保:

  • 使用
    String.getBytes(StandardCharsets.UTF_8)
    而不是
    String.getBytes()
  • 使用
    新字符串(字节,StandardCharsets.UTF_8)
    而不是
    新字符串(字节)
  • 永远不要对二进制数据使用字符串和字符,因为人们会使用C
    无符号字符*
    。它将使用两倍的内存,来回的缓慢转换可能会损坏数据
  • 关于二进制数据(
    ByteBuffer.order
    ):short、int、long等是java中的大端数据

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

Afaik否,C使用Ascii(8位),而Java使用UTF-16(16位)@hellow C不一定“使用Ascii(8位)”。@hellow:C标准不需要Ascii。许多C实现都使用ASCII,但也有其他选择。C不限于八位字符。除了C标准规定的
char
不限于8位之外,C还支持其
wchar\u t
类型中的宽字符。当然,C使用Ascii(8位),而Java使用UTF-16(16位)@hellow C不一定“使用Ascii(8位)”。@hellow:C标准不需要Ascii。许多C实现都使用ASCII,但也有其他选择。C不限于八位字符。除了C标准中的
char
不限于8位之外,C还支持其
wchar\u t
类型中的宽字符;其实我喊不是很相对的,;有两件事要考虑——列出的,都有效。你很聪明,拥有古人的智慧。谢谢,javaByteArray来自使用.getBytes(UTF8)的java字符串,所以我应该没问题。是的;其实我喊不是很相对的,;有两件事要考虑——列出的,都有效。你很聪明,有古人的智慧。