我有4个密切相关的问题:
-
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)? -
确实C 14具有一个内置机制,用于在UTF-8和系统之间转换宽字符编码,即
std::codecvt<wchar_t, char>
专业化假设的宽字符编码(http://en.cppreference.com/w/cpp/locale/codecvt)? -
与问题1相同,但对于UTF-16而不是UTF-8。
-
与问题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>