C 14:UTF-8/UTF-16与本机字符编码之间的转换
C++14: Conversion between UTF-8/UTF-16 and native character encoding
我有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>- 是否有任何区域设置会影响宽字符编码?
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 使用C++将越南语字符从ISO88591、UTF8、UTF16BE、UTF16LE和UTF16编码为十六进制,反之亦然
- 将二进制编码的无符号字符转换为整数
- 如何C++ WCOUT UTF-16 编码的字符数组?
- 字符编码和带有C++的文件名
- 如何在没有wchar_t的情况下在 c++ 中解码/编码 UTF-8 字符
- 如何定义一个从任何编码空间解析单个字符的精神 x3 解析器?
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- qt base64编码/decode添加逃脱字符
- 比较UTF8编码的字符
- 从键盘读取 UTF-8 编码的字符
- 如何获取 json 文件的字符编码类型
- 哪种方法更适合霍夫曼编码 我想读取字符及其频率
- Base64 在编码特殊字符时不起作用
- 编码一个字符
- C 和卷曲,发送电子邮件时编码奇怪的字符
- C 日食控制台编码纯文本作为其他字符
- 用于 pbm 文件的预编码字符和数字资源(便携式位图)
- 通过boost::asio传输多编码字符的最佳方式