我开始用C++进行开发,并且正在控制台中开发一个简单的计算器,当我的程序询问用户是否要退出时,不会出现字符“¿”(西类牙语的问题在“¿”和“?”之间? ')

有人能帮我吗?

PD:问题仅在Windows中发生,而在Linux中不发生

编辑:这是输出代码的代码:

cout << '¿' <<"Desea salir (S/N)? " ;

最佳答案

有几种方法可以解决此问题。

基本的问题不是控制台中不存在¿,而是控制台和您的C++文本编辑器对该字符的含义不一致。两者对英语以外的许多字符使用不同的字符代码。字符代码32-126(字母,数字,标点和括号)普遍相同。但是,从西类牙文的 Angular 来看,字符代码128到255包括所有重音字符,“带有变音符的u”(例如“pingüino”),Ñ以及开头的¿和¡,这取决于特定的环境。

为什么在字符代码中存在如此不便的分歧是历史性的偶然事件,虽然很有趣,但超出了此问题的范围。为简单起见:在Windows OS中,“控制台”(通常)使用OEM Code Page 437中描述的字符列表,而Windows应用程序(如C++编辑器)(通常)使用Windows-1252 Code Page

没有针对此问题的便携式(通用)解决方案,因为不同字符集的问题是特定于平台的问题。不幸的是,Windows有点独特,因为编辑器和(控制台)输出使用不同的集合。

第一个也是最简单的解决方案-适用于玩具程序-只是从OEM 437代码页中查找所需的字符代码,然后使用它。对于¿,它是#168(十六进制为0xa8,八进制为\ 250)。您可以将字符代码嵌入字符串中,以明确您要执行的操作,其中之一:

std::cout << ""\x0a8""Cu""\x0a0""l es el primer n""\x0a3""mero?\n"; // hex
std::cout << "\250Cu\240l es el primer n\243mero?\n";  // octal

输出:
¿Cuál es el primer número?

请注意,我必须对ú和á做同样的事情。不幸的是,编写这样的字符串很快变得笨拙。使用宏或const char可以帮助,但效果不明显。

第二种选择是使用Windows函数,例如CharToOemA。例如1:
#include <windows.h>
...
...
char pregunta[] = "¿Cuál es el primer número\n";
char *pregunta_oem  = new char[sizeof(pregunta)/sizeof(char)];
CharToOemA(pregunta, pregunta_oem);
std::cout << pregunta_oem;
delete []pregunta_oem;

对于更复杂的程序,我会将其包装到实用程序函数或类中。

另一种方法是更改​​控制台的“代码页”,以使其与您的C++编辑器和Windows的其余部分一致。您可以通过CHCP控制台命令或SetConsoleOutputCP()函数来执行此操作,但这不适用于控制台使用的默认“光栅字体”,因此您也必须更改字体。当字体设置为像Lucida Console这样的unicode字体时,这可以工作:
std::cout << "¿Cuál es el primer número?\n"; // ┐Cußl es el...
UINT originalCP = GetConsoleOutputCP();
SetConsoleOutputCP(1252);
std::cout << "¿Cuál es el primer número?\n"; // ¿Cuál es el...
SetConsoleOutputCP(originalCP);

(我不知道您是否可以从程序本身更改字体;我必须进行查找。从控制台执行此操作的标准方法是单击角落的小图标,依次单击“属性”,“字体”标签,然后从列表中选择一种字体)。

1我必须提醒您,此代码段包含许多微妙之处,可以轻易使初学者绊倒。您必须确保文本的来源是char数组;如果您使用的是char指针,则sizeof将无法正常工作,而您必须使用strlen(source)+1。对于源,我使用了初始化为文字的char数组的自然选项,但是您无法对目标执行此操作,因为此类数组的内容为只读/只读。如果您使用的是new'd char数组或未初始化为文字的数组,则可以将相同的char数组用于源和目标。这个例子感觉很像C。

10-02 01:38
查看更多