C++ C+中的Unicode+;支持

C++ C+中的Unicode+;支持,c++,C++,关于这件事有一些帖子,但我想再核实一下。 Joel Spoolsky的文章()中写道: 在C++代码中,我们只将字符串声明为WCHARGETT(“宽char”)。 使用wcs函数而不是str函数(对于 示例wcscat和wcslen,而不是strcat和strlen)。创建 C代码中的文本UCS-2字符串您只需在其前面加一个L,如下所示: L“你好” 我的问题是:上面写的是什么,不足以支持C++应用程序中的UndoCobe? 当我无法输出简单的文本时,我开始感到困惑,比如(俄语): wcout首

关于这件事有一些帖子,但我想再核实一下。 Joel Spoolsky的文章()中写道:

<>在C++代码中,我们只将字符串声明为WCHARGETT(“宽char”)。 使用wcs函数而不是str函数(对于 示例wcscat和wcslen,而不是strcat和strlen)。创建 C代码中的文本UCS-2字符串您只需在其前面加一个L,如下所示: L“你好”

我的问题是:上面写的是什么,不足以支持C++应用程序中的UndoCobe? 当我无法输出简单的文本时,我开始感到困惑,比如(俄语):


wcout首先,您不能在命令行中打印非英语字符

第二,简要介绍;UNICODE对每个字符使用两个字节,而char使用单字节。例如,字符串“ABC”将以ABC\0的形式存储在字符中(3个字节+字符串的结尾)

但在UNICODE中,将存储为\0B\0C\0\0\0(字符串的6+结尾字符,与其他字符一样为两个字节)

要查看某些文本,我建议您访问MessageBoxW:

首先包括windows头文件:
#包括

第二次使用MessageBoxW API函数:

MessageBoxW(0, L"UNICODE text body", L"title", MB_ICONINFORMATION);

这在linux、utf8机器上的C++11中工作:

#include <iostream>

int main(int, char**) {
  std::cout << u8"Humberto Massa Guimarães\nлогин\n";
}
#包括
int main(int,char**){

STD:你到底是什么意思C++?你想携带,还是只关心Windows?问题中的引用是旧的和Windows特定的。也许你只是打印了控制台不能打印的字符。<代码> W查尔格T < /COD>与编码AFAK没有任何关系。(宽字符/字符串文字使用扩展源字符集..仅此而已)。您可以通过编程方式将控制台设置为能够输出俄语文本。仅使用wchar是不够的。第一:否?!(即使在windows中,您也可以在命令行上打印unicode字符)第二:否?!(即使在UTF-16中,也有两个代码单位字符,IIRC是补充的多语言平面)哦,我也爱上了它:(-)没有Unicode字符,只有UTF-8编码的字符。这当然意味着非ASCII字符。@DyP实际上有16个带有代码点的平面,需要2个UTF-16代码单元。大约94%的Unicode代码点需要UTF-16中的4个字节。在Unicode 6.2中,大约55%的当前分配的代码点需要在UTF-16中需要四个字节。(但是,请记住,这并不意味着它们在55%的时间内显示)。我知道我迟到了7年,但这需要完成。“首先,你不能在命令行中打印非英语字符”-是的,你可以。一些终端可能不支持UTF8,但即使是Windows也有一个开关来启用UTF8代码页。第二,简单地说,UNICODE对每个字符使用两个字节,而char使用单字节。例如,字符串“ABC”将作为ABC\0(3个字节+字符串的结尾)存储在char中"-不,UTF-16每个字符需要2个字节。UTF-8只需要一个。UTF-8、16和32都可以存储相同的字符,但它们的存储方式不同。即使缺少字体或unicode支持,终端仍会打印。它不在乎-它被告知要打印字符,并且会很乐意这样做,即使输出是一堆垃圾无法读取d,因为字符已替换为方框。但是,使用字体和正确的编码,所有主要终端(无论是哪个操作系统)都可以打印UTF8,以避免进一步污染OP中的注释部分:
wchar\u t
仅指定为至少16位宽。在某些使用g++的Linux系统上(在许多情况下?)它是32位宽。这与编码无关。
char16\u t
取代了
wchar\u t
作为UTF-16的容器,因为它被指定为正好16位宽。另请参见->
wchar\u t
在C90中引入(->最可能不适用于windows)IIRC、@DyP、Windows和OS/2是第一个广泛使用的16位字符区域设置的OSs(当时,没有类似于互联网的东西,我们只听说JIS编码是16位编码)。其他人都在使用8位编码,主要是基于IBM的8位代码页。是的,那是1986年左右。我记得在1988年与我的一位大学好友就此事进行了一次谈话,他感到害怕,“但所有字符串都浪费了两倍的内存!太荒谬了!”。当时我们有1.4MB的软盘和10MB的硬盘。
#include <iostream>

int main(int, char**) {
  std::cout << u8"Humberto Massa Guimarães\nлогин\n";
}