关于C+中完整unicode的基本问题+; < C++中使用完整的Unicode的适当设备是什么?
例如,我尝试过:关于C+中完整unicode的基本问题+; < C++中使用完整的Unicode的适当设备是什么?,c++,unicode,wstring,C++,Unicode,Wstring,例如,我尝试过: int main() {
int main()
{
std::wstring name;
std::wcout << "Enter unicode: " << std::endl;
std::getline(std::wcin, name);
std::wcout << name << std::endl;
return 0;
}
intmain()
{
std::wstring名称;
Std::WcOut你在C++ Unicode的灰色区域。Unicode最初是由7位ASCII字符的扩展开始的,或者是多字节字符到16位字符,后来变成BMP。这16位字符是通过java之类的语言,以及C++和C++系统在STAN上更保守地采用的。dard的观点决定,wchar\u t
将是一个依赖于实现的宽字符集,可以是16或32位宽(甚至更宽…)根据需求而定。好的一面是它是可扩展的,坏的一面是当wchar___________________________________
然后创建UTF-16以允许这些非BMP字符的标准表示,缺点是它们需要2个16位字符,std::char\u traits::length
如果其中一些字符出现在wstring中,则同样会出错
<>这就是为什么大多数C++实现选择了 WCARGYTT < /Code > Basic IO只处理正确的BMP Unicode字符的<代码>长度>代码>返回真个字符数。
C++-ish的方法是在需要完全unicode支持时使用基于char32_t
的字符串。事实上wstring_t
和wchar_t
(前缀L表示literal)是依赖于实现的类型,而且由于C++11,您也有char16_t
和u16string
(前缀u)明确使用UTF-16,或char32\U t
和u32string
(前缀U)通过UTF-32获得完全的unicode支持。将BMP之外的字符存储在U16字符串中的问题是,您丢失了字符串的属性大小==字符数,这是使用宽字符而不是多字节字符的一个关键原因
u32string的一个问题是io库仍然没有直接专门化32位字符,但正如转换器所做的那样,当您使用std::basic_fstream
处理文件时,您可能可以轻松地使用它们(未经测试,但根据标准应该可以工作)但是您将没有用于cin
、cout
和cerr
的标准流,并且可能必须从string
或u16string
中处理本机,然后在C++14中引入的标准转换器的帮助下转换u32string
中的所有内容,或者如果仅使用C,则必须以艰难的方式转换++十一,
真正的阴暗面是,由于本地部分目前依赖于OS,您将无法设置完全可移植的方式来处理完整的Unicode——或者至少我不知道。< / P>可能的感谢Sahib。我在Debian上寻找平台中立的解决方案,简单的C++解决方案。这个链接似乎提供了一个非常窗口。具体答案。您应该为Unicode字符串文本使用L前缀:std::wcout好的,好提示。在这种情况下不会影响我的错误。它确实最终取决于输出流。例如,默认情况下,Windows不支持标准控制台中的全套Unicode字符。因此,您必须添加一些与平台相关的调整。
std::u16string
不限于BMP(使用UTF-8时,std::u16string
不受限制,或者使用UTF-16/32时,std::wstring
不受限制,具体取决于wchar\u t
的大小。char16\u t
和std::u16string
是专门为UTF-16设计的string prefix返回一个完整的UTF-16编码的std::u16string
,而不是像您所暗示的UCS-2编码的字符串).UTF-16处理整个Unicode指令集。char32\u t
和std::u32string
是为UTF-32设计的,UTF-32也处理整个Unicode指令集。@RemyLebeau:谢谢您的评论!我的意思是,当您在u16string中使用UTF-16编码字符串时,您会丢失属性长度==字符数,这是一个键使用宽字符而不是多字节字符的原因。希望现在更清楚的是,随着MBCS字符集的发明,length==number of chars属性在几十年前就消失了。只有专门处理英语和其他拉丁语的代码才可以依赖该属性。真正的国际应用程序不会使用该属性ng时间。也就是说,大多数现代语言都适合BMP,因此该属性通常在大多数文本中都适用。亚洲语言,以及最近的表情符号,以及Unicode(古代语言、数学/音乐符号等)不太常见的用法,都需要使用代理。