std::codecvt_utf8_utf16 不会在大端序中将 UTF-8 转换为 UTF-16
std::codecvt_utf8_utf16 doesn't convert utf-8 to utf-16 in big-endian
我使用wstring_convert
&将utf-8编码的字符串转换为utf-16编码的字符串。codecvt_utf8_utf16
#include <iostream>
#include <codecvt>
#include <string>
#include <fstream>
#include <cstdint>
std::u16string UTF8ToWide(const std::string& utf_str)
{
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
return converter.from_bytes(utf_str);
}
void DisplayBytes(const void* data, size_t len)
{
const uint8_t* src = static_cast<const uint8_t*>(data);
for (size_t i = 0; i < len; ++i) {
printf("%.2x ", src[i]);
}
}
// the content is:"你好 hello chinese test 中文测试"
std::string utf8_s = "xe4xbdxa0xe5xa5xbd hello chinese test xe4xb8xadxe6x96x87xe6xb5x8bxe8xafx95";
int main()
{
auto ss = UTF8ToWide(utf8_s);
DisplayBytes(ss.data(), ss.size() * sizeof(decltype(ss)::value_type));
return 0;
}
根据参考手册, codecvt_utf8_utf16
面std::codecvt_mode
的默认参数为大端。
但是,测试程序显示的字节如下
60 4f 7d 59 2000 68 000 65 000 6c 00 60 c 00 60 f 00 2000 63 00 68 000 694e, 4e, 4e, 4e, 4e, 4e, 4e, 4e, 4e, 4e, 4e, 4e, 4e, 4e, 4e, 4e87 65 4b 6d d5 8b
表示小端序
我分别在Visual Studio 2013和clang上运行测试代码,并最终得到相同的结果。
那么,为什么codecvt_utf8_utf16
的大端模式对这些转换没有任何影响?
您引用的同一页说little_endian
标志仅用于输入。输出是一个码点序列,而不是字节流。每个代码点都使用平台的正常方式表示——在您的例子中是小端序。
你的程序只是告诉你char16_t
是如何在内存中表示的。
相关文章:
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 从/到 UTF-8/UTF-16 的转换需要(例如:utf8 -> 代码点,然后代码点到 utf16)或(例如:utf8 -> utf16)?
- 通过分隔符分隔包含 UTF-16 BE 文本的uint8_t数组
- 如何从Little Endian UTF-16编码字节中获取C++std::string
- C++ UTF-8/ASCII to UTF-16 in MFC
- 如何C++ WCOUT UTF-16 编码的字符数组?
- 在这种情况下,UTF-16 和 UTF-32 的 BOM 是强制性的
- 查找十六进制字符串是 utf-8 或 utf-16
- 如何在C 17中读取UTF-16文本文件
- 在 Linux 中将 UTF-32 宽字符转换为 UTF-16 宽字符以获取补充平面字符
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- UTF-16 流中的 CRLF 错误?
- Windows的unicode数据类型使用什么unicode编码(UTF-8、UTF-16等)
- 可以将 UTF-8/UTF-16 选项传递给从C++调用的 JVM
- UTF 16 到 UTF8,使用 C++ 中的 utf8 库
- 使用标准C++无线流读取UTF-8文本并转换为UTF-16
- 将字节数组从UTF-16转换为UTF-8
- 如何将UTF-16中的字符串转换为C 中的UTF-8
- 在 VS 调试器中显示 UTF-16 字符串
- 为什么我不能在窗口上使用 boost::locale::conv::between 将 UTF-16 文本转换为其他编码