关于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(古代语言、数学/音乐符号等)不太常见的用法,都需要使用代理。