我正在
C++
中编写一个程序,我需要检测重音符号和宏符号,所以 áéíóúāēīōūȳ
。我正在使用Windows 11
。我使用 getline(cin, input)
,如果 input
有任何长音符号或重音符号,它会将其视为空白字符,ágȳ
= g
。
我使用带有
chcp 65001
的 powershell 终端,它可以正确显示带有 cout
的重音符号,但无法正确接收输入。
这是一些代码:
#include <iostream>
#include <locale>
#include <string>
using namespace std;
int main() {
// Set the console to UTF-8 encoding
// system("chcp 65001 > nul");
setlocale(LC_ALL, "es_ES.UTF-8"); // Ensure UTF-8 encoding
string a;
cout << "Write here āēīōū (with accents and macrons):" << endl;
// Capture input with getline
getline(cin, a);
cout << endl << "You wrote: " << a << endl;
// Compare the input with a specific character
if (a == "á") {
cout << "It's the same!" << endl;
} else {
cout << "It's not the same." << endl;
}
for (int i = 0; i < a.size(); ++i)
cout << "a[i]: " << a[i] << endl;
cout << endl;
return 0;
}
我正在使用 Microsoft 的新终端应用程序,并且我可以为每个字符获得正确的输入和输出:
if (a == "ȳ") {
Write here āēīōū (with accents and macrons):
ȳ
You wrote: ȳ
It's the same!
a[i]:
代码末尾的迭代不起作用的原因非常简单:std::string 以多个字节序列存储 utf8 字符(char AFAIK)。您不能只是从 std::string 指向的序列中提取 utf8 符号。
更改为
cout << "a[i]: " << a << endl;
解决了问题:
Write here āēīōū (with accents and macrons):
āēīōū
You wrote: āēīōū
It's not the same.
a[i]: āēīōū