Windows 控制台代码页 866
Posted
技术标签:
【中文标题】Windows 控制台代码页 866【英文标题】:windows console codepage 866 【发布时间】:2018-03-13 15:04:36 【问题描述】:我使用的是最新版本的 Windows 10。当我尝试从 boost asio 运行客户端示例代码时 并在这一行得到了预期的异常:
catch (const std::exception& e)
std::cerr << e.what() << std::endl;
return 1;
它在控制台上输出象形文字:
connect: ╧юфъы■ўхэшх эх єёЄрэютыхэю, Є.ъ. ъюэхўэ√щ ъюья№■ЄхЁ юЄтхЁу чряЁюё эр яюфъы■ўхэшх
我的控制台的默认代码页是 866,因为我使用的是俄罗斯窗口。然后我通过
将代码页更改为 1251chcp 1251
消息看起来不错:
connect: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
我只是好奇,在不使用 chcp 进行任何操作的情况下,是否有任何解决方法?
【问题讨论】:
那些看起来不像我见过的任何象形文字! 解决方法:停止使用 C++ I/O 流库,并使用 Unicode 版本的 WriteConsole。并且停止使用相信 ANSI 编码来解决任何问题的库。 这个问题比它应该的要少得多。文本由 FormatMessage() 生成,按照您在 Boost 中使用的方式进行试验。错误代码是 10061。小心 BOOST_NO_ANSI_APIS。 【参考方案1】:如果您想从 C++ 代码中执行此操作,请使用 SetConsoleOutputCP。
【讨论】:
这只是解决方案的一半。您还必须确保 ASIO 库使用的语言环境和 C++ I/O 流使用的语言环境与各自的代码页相匹配。可以说,完全不依赖 ANSI 编码要容易得多。 由于 exception::what 返回可能由 OP 提供的 char*,当然可以使用 SetConsoleOutputCP(CP_OEMCP) 然后 MultiByteToWideChar 然后 std::wcerr 来支持大多数 unicode,但我得到了印象中所需要的只是 Windows Cyrillic 代码页 1251。 正确。直到该代码在其他机器上运行。然后你必须确保所有 3 方也同意相同的代码页。这将不可避免地打破。这是一个应该向 ASIO 库作者提出的问题:不要尝试本地化异常消息。您只能使用 ASCII。除非你想让你的用户受苦。 所以要将消息转换为 unicode,我应该以某种方式确定使用 asio 的 ascii 代码页,然后通过 winapi 函数将消息转换为 wchar_t,然后通过输出流的 Widechar 版本将其输出到控制台? @alexfsx:嗯,不。与 ASIO 库作者交谈,让他们知道异常消息不是面向用户的,不应本地化。让他们用简单的英语为您提供 ASCII 文本,您就不必处理控制台代码页、语言环境或转换。以上是关于Windows 控制台代码页 866的主要内容,如果未能解决你的问题,请参考以下文章