std :: codecvt_utf8_utf16在big-endian

时间:2016-08-28 10:28:43

标签: c++ c++11 utf-8

我使用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 = "\xe4\xbd\xa0\xe5\xa5\xbd hello chinese test \xe4\xb8\xad\xe6\x96\x87\xe6\xb5\x8b\xe8\xaf\x95";

int main()
{
    auto ss = UTF8ToWide(utf8_s);
    DisplayBytes(ss.data(), ss.size() * sizeof(decltype(ss)::value_type));
    return 0;
}

根据reference manual方面std::codecvt_modecodecvt_utf8_utf16的默认参数为big-endian

但是,测试程序显示如下字节

  

60 4f 7d 59 20 00 68 00 65 00 6c 00 6c 00 6f 00 20 00 63 00 68 00 69   00 6e 00 65 00 73 00 65 00 20 00 74 00 65 00 73 00 74 00 20 00 2d 4e   87 65 4b 6d d5 8b

是小端的。

我分别在Visual Studio 2013和clang上运行了测试代码,最终得到了相同的结果。

那么,为什么codecvt_utf8_utf16的big-endian模式对这些转换没有任何影响呢?

1 个答案:

答案 0 :(得分:1)

您引用的同一页面显示 <Button Background="Transparent" BorderBrush="Transparent" > <ContentControl> <Image Width="160" Height="55" Source="C:\images\mute.jpg" /> </ContentControl> Mute </Button> 标志仅供输入。输出是一系列代码点,而不是字节流。每个代码点都使用平台的正常表示 - 在您的情况下是小端。

您的程序只是告诉您如何在内存中表示little_endian