c ++ std :: vector <byte>转换为UTF16编码的字符串

时间:2019-06-30 21:43:01

标签: java c++ unicode utf-16

我正在开发一个应用程序,其中使用Java JCA AES加密在c ++应用程序内部解密的字符串值。我正在使用crypto ++库进行解密,并且能够恢复原始字节,但是停留在最后一步,我需要将它们转换回原始UTF16编码的字符串。我将字节存储在std :: vector数据结构中。 向量的内容(以十六进制表示){fe ff 00 49 00 6c 00 6f 00 76 00 65 00 6a 00 61 00 76 00 61}

如何将其转换为UTF16字符串?

1 个答案:

答案 0 :(得分:1)

首先,在C ++ 11中,您具有char16_tstd::u16string,它们分别表示UTF-16代码点和UTF-16编码的字符串。此外,您可以使用std::codecvt在UTF-16和其他表示形式(UTF-8,wchar_t的平台版本等)之间来回转换

因此,您可以使用字符串中的数据。但是,首先您必须将其从字节向量转换为char16_t序列,因此首先需要检查字节是否实际为偶数,然后将其复制或reinterpret_cast作为char16_t。但是,在执行此操作之前,您需要处理可能endianness的数据和平台的数据。

在您显示的特定数据样本中,前几个字节是FE和FF,很有可能是the byte order mark,这是一个精确用来区分平台字节序的字符。非常概括地说,U + FEFF在计算机上可能显示为字节(FE FF)或(FF FE)。如果您的平台与数据流的字节顺序相反,则将第一个字符读取为U + FFFE,这是一个故意留空且永远不会出现的插槽,因此您必须交换整个流的字节。否则,如果您正确读取了U + FEFF,则只需保留流不变,然后继续将字节解释为char16_t

请注意,这可能是,因为输入流特别将此标记作为第一个字符;否则,您将无法确定是否肯定缺少将流标记为UTF-16LE(小端)或UTF-16BE(大端)的外部元数据。在某些情况下,存在此类元数据(例如,因为Java语言规范可能会这样说),但在其他情况下,缺少BOM会导致应用启发式方法。例如,如果您知道文本主要是英语,则应该有很多00个字节,并且您可以看到它们最终以偶数还是奇数结尾...但是这有失败的可能,也许您看到的是中文文字,并且没有太多的空值。