gpt4 book ai didi

c++ - 如何从 Windows 控制台读取 utf-8 字符?似乎 ReadConsoleOutputCharacter() 无法处理它们

转载 作者:行者123 更新时间:2023-11-28 03:35:50 28 4
gpt4 key购买 nike

这是隔离问题的代码:

#include <iostream>
#include <windows.h>

using namespace std;

int main() {
SetConsoleOutputCP(CP_UTF8);
_wsystem(L"echo pure ascii, naïveté");
COORD pos = {0,0};

TCHAR* attempt1 = new TCHAR[14];
DWORD charnum1;
ReadConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), attempt1, 14, pos, &charnum1);
wcout << endl << "charnum1: " << charnum1 << ", attempt1: " << attempt1 << endl;
wcout << "GetLastError: " << GetLastError();

TCHAR* attempt2 = new TCHAR[16];
DWORD charnum2;
ReadConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), attempt2, 16, pos, &charnum2);
wcout << endl << "charnum2: " << charnum2 << ", attempt2: " << attempt2 << endl;
wcout << "GetLastError: " << GetLastError();

system("pause > nul");
}

输出是:

pure ascii, naïveté

charnum1: 14, attempt1: pure ascii, na
GetLastError: 0
charnum2: 0, attempt2: x >
GetLastError: 0

第一次尝试工作正常,但是当函数尝试使用非 ASCII 字符读取位置时,它什么都不返回,也没有指示任何错误。现在该怎么办?

最佳答案

警告:在我的系统上,CP_UTF8 不可用,因此当我运行您的代码时,echo 命令导致“系统无法写入指定的设备。”

但是,如果我删除 SetConsoleOutputCP() 调用并将其保留在默认代码页 437,我就能正确显示字符串。

请注意,有单独的读取和写入代码页。我尝试了 437、850、1252 和 28591 的各种组合——后两个或多或少映射到 Unicode 的前 255 个代码点。如果 CP_UTF8 适合您,请通过调用 SetConsoleCP(CP_UTF8) 重试您的代码。

请注意,ReadConsoleOutputCharacter() 不会在最后读取的字符后放置一个空值,因此当您输出该 TCHAR 数组时,您的代码中存在问题:您无法保证它为空值-终止,它可能会崩溃。 (此外,您不会删除分配的 TCHAR 数组。)因此,我将分配行更改为:

TCHAR attempt1[] = L"____________________";  // 20 underscores

(没有调用 SetConsoleOutputCP())产生了这个:

charnum1: 14, attempt1: pure ascii, na______
charnum2: 16, attempt2: pure ascii, na∩v____

第二行倒数第二个字形不是“n”,它是代码页 437 中的字符 0xEF。“ï”是 Unicode 中的字符 0xEF。这里发生的事情是,从控制台读取了正确的代码点 (0xEF),但流输出继续使用 437 代码页。流输出根据 locale setting of the stream 选择其字符,而不是在控制台中设置的代码页。

我不知道为什么当控制台的 READ 代码页仍然是 437 时从控制台读取所需的代码点值。我也很困惑为什么,如果我 SetConsoleOutputCP(1252) (或28591),echo 命令的输出看起来像是在使用 CP 437:pure ascii, na∩vitΘ

关于c++ - 如何从 Windows 控制台读取 utf-8 字符?似乎 ReadConsoleOutputCharacter() 无法处理它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10904983/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com