java - 相当于java中C++基本字符串

标签 java arrays character-encoding

我有一个在 C++ 和 Java 中返回字节数组的函数,该函数的逻辑是相同的。

鉴于返回的字节数组是相同的,当我在转换为基本字符串后打印数组时,例如:

std::string str(byteArray,byteArray+len)

我能够正确地看到输出,但是当我执行以下操作时:

new String(byteArray,"UTF-8")

我在终端上收到一些未知字符。如何检索与 C++ 相同的输出?

最佳答案

问题就在这里。当你这样做时:

    new String(byteArray,"UTF-8")

你正在对运行时系统说:

The byte array contains character data that has been encoded as UTF-8. Convert it into a sequence of Unicode codepoints1 and give them to me as a Java String.

但是字节数组中的字节显然不是格式良好的 UTF-8 序列,因为你得到的东西看起来像垃圾。

所以这是怎么回事?我认为有两种可能性:

  1. 数组中的字节实际上可能是采用不同字符编码的字符。它显然不是 ASCII 数据,因为纯 7 位 ASCII 的格式也与 UTF-8 一样。但字节可以用其他一些字符编码进行编码。 (如果我们确实有字节值,我们也许能够对使用的编码进行有根据的猜测。)

  2. 数组中的字节实际上可能是乱码。你说它们是通过解密AES加密数据得到的。但是,如果您以某种方式解密不正确(例如,您使用了错误的 key ),那么您最终会得到乱码。

最后,Java 中与 std::string str(byteArray,byteArray+len) 最接近的等效项是:

  new String(byteArray, "LATIN-1")

这是因为 LATIN-1 序列中的每个编码字节的值都等于等效的 Unicode 代码点。

目前还不清楚这是否真的适用于您的情况。当然,如果由于加密或解密不正确而导致字节乱码,那就不行了。或者加密数据在传输过程中出现乱码。

<小时/>

1 - 实际上,UTF-16 代码单位 ...但那是另一个故事了。

关于java - 相当于java中C++基本字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49627690/

相关文章:

python - 使用python检测错误的字符编码

java - 为什么我不能在 ejb 模块中创建 RESTful Web 服务?

ios - 具有自定义类的iOS数组到具有NSString的数组

java - Android:使用数组项填充 ListView

ruby - 匹配数组中的模式

c# - 0 值的 System.Text.Encoding.Default.GetString(byte[]) 结果

JAVA使用to.String()方法返回电阻网络的字符串

java - 使用 Maven 使用注释 @Tag ("name_test") 过滤 JUnit 5 测试用例

java - ApplicationContext 和 beans 检索

text - 如何确定文本文件的编码表