Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C+中使用Unicode+;?_C++_String_Unicode - Fatal编程技术网

C++ 如何在C+中使用Unicode+;?

C++ 如何在C+中使用Unicode+;?,c++,string,unicode,C++,String,Unicode,假设一个非常简单的程序: 问一个名字 将名称存储在变量中 在屏幕上显示可变内容 它是如此简单,这是一个人学习的第一件事 但我的问题是,如果我用日语字符输入名字,我不知道如何做同样的事情 >,如果你知道如何在C++中做这件事,请给我一个例子(我可以编译和测试) 谢谢 用户362981:谢谢你的帮助。我编译了您编写的代码,没有问题,控制台窗口会出现,我无法在上面输入任何日语字符(使用IME)。如果 我将代码中的单词(“hello”)更改为包含日语字符的单词,它也不会显示这些字符 斯维斯塔克:

假设一个非常简单的程序:

  • 问一个名字
  • 将名称存储在变量中
  • 在屏幕上显示可变内容
它是如此简单,这是一个人学习的第一件事

但我的问题是,如果我用日语字符输入名字,我不知道如何做同样的事情

<> >,如果你知道如何在C++中做这件事,请给我一个例子(我可以编译和测试)

谢谢


用户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