C++ 如何在C+中使用Unicode+;?
假设一个非常简单的程序:C++ 如何在C+中使用Unicode+;?,c++,string,unicode,C++,String,Unicode,假设一个非常简单的程序: 问一个名字 将名称存储在变量中 在屏幕上显示可变内容 它是如此简单,这是一个人学习的第一件事 但我的问题是,如果我用日语字符输入名字,我不知道如何做同样的事情 >,如果你知道如何在C++中做这件事,请给我一个例子(我可以编译和测试) 谢谢 用户362981:谢谢你的帮助。我编译了您编写的代码,没有问题,控制台窗口会出现,我无法在上面输入任何日语字符(使用IME)。如果 我将代码中的单词(“hello”)更改为包含日语字符的单词,它也不会显示这些字符 斯维斯塔克:
- 问一个名字
- 将名称存储在变量中
- 在屏幕上显示可变内容
用户362981:谢谢你的帮助。我编译了您编写的代码,没有问题,控制台窗口会出现,我无法在上面输入任何日语字符(使用IME)。如果 我将代码中的单词(“hello”)更改为包含日语字符的单词,它也不会显示这些字符 斯维斯塔克:也谢谢你的帮助。但是,当我编译代码时,会出现以下错误:
warning: deprecated conversion from string constant to 'wchar_t*'
error: too few arguments to function 'int swprintf(wchar_t*, const wchar_t*, ...)'
error: at this point in file
warning: deprecated conversion from string constant to 'wchar_t*'
尝试用wcout替换cout,用wcin替换cin,用wstring替换string。根据您的平台,这可能适用于:
#include <iostream>
#include <string>
int main() {
std::wstring name;
std::wcout << L"Enter your name: ";
std::wcin >> name;
std::wcout << L"Hello, " << name << std::endl;
}
#包括
#包括
int main(){
std::wstring名称;
std::wcout>name;
标准::wcout#包括
#包括
int main()
{
wchar_t name[256];
wprintf(L“键入名称:”);
wscanf(L“%s”,名称);
wprintf(L“键入的名称为:%s\n”,名称);
返回0;
}
你可以在你的操作系统中使用通用的宽字符支持来做简单的事情,但是一般来说C++没有对Unicode的良好的内置支持,所以从长远来看,你会更好地了解一些类似的事情。 < p>你会得到关于宽字符的很多答案。宽字符,特别是代码> WCARGYTT < /Code >不等于Unicode。您可以使用它们(有一些缺陷)来存储Unicode,就像您可以使用无符号字符wchar\u t
一样,它是非常依赖于系统的
对于宽字符类型,ANSI/ISO C提供了
包含固定宽度的宽字符。ANSI/ISO C保留宽字符的语义
字符集指定给特定实现,但要求可移植C执行集中的字符以零扩展对应于其宽字符等价物
那
wchar\u t
的宽度是特定于编译器的,可以小到8位。因此,
需要在任何C或C++编译器上移植的程序不应该使用<代码> WCARGYT T < /COD>
用于存储Unicode文本。wchar\u t
类型用于存储编译器定义的广泛文本
字符,在某些编译器中可能是Unicode字符
因此,它是实现定义的。这里有两种实现:在Linux上,wchar\u t
是4字节宽,表示UTF-32编码中的文本(无论当前语言环境如何)。(BE或LE取决于您的系统,以本机为准。)然而,Windows有一个2字节宽的wchar\u t
,并用它们表示UTF-16代码单元。完全不同
更好的方法:了解地区,因为您需要知道。例如,因为我的环境设置使用UTF-8(Unicode),所以以下程序将使用Unicode:
#include <iostream>
int main()
{
setlocale(LC_ALL, "");
std::cout << "What's your name? ";
std::string name;
std::getline(std::cin, name);
std::cout << "Hello there, " << name << "." << std::endl;
return 0;
}
但它并没有Unicode编码。它只读取字符,这些字符以UTF-8的形式出现,因为我的环境就是这样设置的。我可以很容易地说“见鬼,我是捷克人的一部分,让我们使用ISO-8859-2”:突然,该程序获得ISO-8859-2中的输入,但由于它只是将其返回,因此无所谓,该程序仍将正确执行
现在,如果该示例读取了我的名字,然后试图将其写入XML文件,并且愚蠢地在顶部写入了
,那么当我的终端使用UTF-8时它是正确的,而当我的终端使用ISO-8859-2时它是错误的。在后一种情况下,它需要在将其序列化为XML文件之前将其转换。(或者,只需编写ISO-8859-2作为XML文件的编码。)
在许多POSIX系统上,当前的语言环境通常是UTF-8,因为它为用户提供了一些优势,但这并不能保证。只需将UTF-8输出到标准输出通常是正确的,但并不总是正确的。假设我使用的是ISO-8859-2:如果你不经意地将ISO-8859-1“è”(0xE8
)输出到我的终端,我会看到一个错误“č”(0xE8
)。同样,如果输出UTF-8“è”(0xC3 0xA8
),我将看到(ISO-8859-2)“è”(0xC3 0xA8
)。已调用此错误字符的条形码
通常情况下,您只是随意移动数据,这并不重要。这通常在您需要序列化数据时起作用。(许多internet协议使用UTF-8或UTF-16,例如:如果您从ISO-8859-2终端获取数据,或从Windows-1252编码的文本文件获取数据,则必须将其转换,否则将发送。)
遗憾的是,这是关于Unicode支持的状态,在C和C++中都有。你必须记住:这些语言是系统不可知的,并且不绑定到任何特定的方式。包括字符集。然而,有很多的库用于处理Unicode和其他字符集。
最后,它其实并不那么复杂:知道数据的编码是什么,知道输出应该是什么编码。如果它们不一样,你需要进行转换。这适用于使用std::cout
或std::wcout
。在我的示例中,stdin
或std::cin
和stdout
/std::cout
有时在UTF-8中,有时在ISO-8859-2中。先决条件:
上面的文章是一篇必读的文章,它解释了unicode是什么,但仍然存在一些悬而未决的问题。是的,unicode对每种语言中的每个字符都有一个唯一的代码点,而且它们的编码和存储在内存中可能与实际代码不同。这样,我们可以通过使用UTF-8 encod来节省内存如果语言支持
#include <iostream>
int main()
{
setlocale(LC_ALL, "");
std::cout << "What's your name? ";
std::string name;
std::getline(std::cin, name);
std::cout << "Hello there, " << name << "." << std::endl;
return 0;
}
$ ./uni_test
What's your name? 佐藤 幹夫
Hello there, 佐藤 幹夫.
$ echo $LANG
en_US.UTF-8