C 14:UTF-8/UTF-16与本机字符编码之间的转换



我有4个密切相关的问题:

  1. do c 14具有一种内置机制,用于在UTF-8和系统之间转换,并且本机多键编码,即,由std::codecvt<wchar_t, char>专业化假设(HTTP:http:http:http:http:http:http:http:http://en.cppreference.com/w/cpp/locale/codecvt)?

  2. 确实C 14具有一个内置机制,用于在UTF-8和系统之间转换宽字符编码,即std::codecvt<wchar_t, char>专业化假设的宽字符编码(http://en.cppreference.com/w/cpp/locale/codecvt)?

  3. 与问题1相同,但对于UTF-16而不是UTF-8。

  4. 与问题2相同,但对于UTF-16而不是UTF-8。

编辑:我意识到这些问题中的任何一个都"是",对所有4个问题有效地表示"是",因为C 14显然确实提供了在UTF-8和UTF-16(std::codecvt<char16_t, char, std::mbstate_t>)之间转换的方法以及本地多键和本地宽字符编码(std::codecvt<wchar_t, char>)之间。

系统本机多键编码,即std::codecvt<wchar_t, char>专业化假设的多型

所假定的多型

存在混乱,可能是由于误导性措辞造成的(我的错,现在固定以符合标准和现实);在现有的实现(LIBC 和LIBSTDC )中,独立于语言环境的CODECVT专业化codecvt<wchar_t, char>不处理任何多重编码。标准措辞是"狭窄和宽字符的本地字符集"。现有的实现仅表示1:1的转换,例如btowc/wctob在C中所做的事情:

template<class F> struct facet : F { using F::F; ~facet() {} };
facet<std::codecvt<wchar_t, char, std::mbstate_t>> fp;
std::cout << fp.max_length() << 'n'; // prints 1 in libc++ and libstdc++

实际上,这是LIBC 实现

在每个有用的上下文中,多型编码是由语言保护性的编解码器构面指定的编码,或者是由自定义的CODECVT FACET或UTF-8(由std::codecvt_utf8* Facet提供)。含义

UTF-8和系统之间的本机多键编码

是指" UTF-8和由语言环境指定的多型编码"

#include <codecvt>
#include <locale>
#include <cassert>
template<class F> struct myFacet : F { using F::F; ~myFacet() {} };
int main()
{
    std::string in = u8"水"; // UTF-8
    // utf8 to wide (could've used en_US.utf8, but this one exists as-is)
    std::wstring ws = std::wstring_convert<std::codecvt_utf8<wchar_t>>{}.from_bytes(in);
    assert(ws == L"水");
    // wide to another mb (have to use a named locale now)
    typedef myFacet<std::codecvt_byname<wchar_t, char, std::mbstate_t>> F;
    std::string out = std::wstring_convert<F>{ new F("zh_CN.gb18030") }.to_bytes(ws);
    assert(out == "xcbxae");
} 

确实C 14具有一个内置机制,用于在UTF-8和系统本地宽字符之间转换

本机宽有效地定义为Unicode或(如在Windows上)其任意子集,这就是您从std :: codecvt_utf8获得的。只要它们映射1:1,敌对的实现可能在数值上具有数值不同的WCHAR_T保存值,但是鉴于它们必须与基本charset相等,这是不现实的。

<。 <</p> <。/div>

最新更新