首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在大端,std::codecvt_utf8_utf16不会将utf-8转换为utf-16。

在大端,std::codecvt_utf8_utf16不会将utf-8转换为utf-16。
EN

Stack Overflow用户
提问于 2016-08-28 10:28:43
回答 1查看 1.2K关注 0票数 1

我使用wstring_convert & codecvt_utf8_utf16将utf-8编码中的字符串转换为utf-16中的字符串。

下面是我测试的示例代码:

代码语言:javascript
复制
#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;
}

根据参考手册的说法,codecvt_utf8_utf16 中的默认参数是大端

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

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

在小安迪安。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-28 10:59:03

您引用的相同页面表示,little_endian标志仅用于输入。输出是代码点序列,而不是字节流。每个代码点都使用平台的任何正常代码来表示--在您的例子中,是小endian。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39190336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档