【问题标题】:GetComputerName() not displaying Unicode correctly in Windows consoleGetComputerName() 在 Windows 控制台中未正确显示 Unicode
【发布时间】:2016-04-10 03:23:08
【问题描述】:

我对 C++ 中的 WinAPI 编程比较陌生。我正在尝试编写一个程序,该程序将使用 GetComputerName() 获取系统主机名。理想情况下,我希望代码能够在英语和非英语系统上工作。以下是我正在使用的代码:

int main()
{
    wstring hostname;
    wchar_t nbtName[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD length = MAX_COMPUTERNAME_LENGTH + 1;
    GetComputerName(nbtName, &length);
    hostname = nbtName;

    wcout << hostname << endl;

    return 0;
}

代码在我的英语 Windows 7 系统上运行良好,但代码似乎无法在我的德语 Windows 7 系统上正确显示(它使用德语字符作为主机名)。我认为 wstring 和 wchar_t 可以处理这些特殊字符。这是我的德语 Windows 7 系统上显示的内容。

COMPUTER-Í─▄▀

我是否忽略了一些愚蠢的事情?谢谢!

【问题讨论】:

  • 您能否成功将名称复制/粘贴到控制台中?也许控制台使用的字体对于所需的代码点具有不同的字形。
  • 如果我使用 Windows“主机名”命令,德语字符会正确显示。

标签: c++ unicode


【解决方案1】:

使用_setmode(_fileno(stdout), _O_U16TEXT) 在控制台窗口中显示Unicode:

#include <iostream>
#include <string>
#include <io.h> //for _setmode
#include <fcntl.h> //for _O_U16TEXT

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"ελληνικά\n";
    return 0;
}

或使用MessageBoxW(0, hostname.c_str(), 0, 0) 或OutputDebugStringW 来查看正确显示的Unicode 文本:

【讨论】:

    【解决方案2】:

    这个函数有两个版本 GetComputerNameW 用于 unicode 和 GetComputerNameA 用于 ANSI。如果在您的环境中定义了 UNICODE,则将调用第一个。因此,要么确保定义了 UNICODE,要么尝试直接调用 GetComputerNameW。

    【讨论】:

    • Unicode 是在我的项目中定义的。我尝试了 GetComputerNameW() 函数而不是 GetComputerName() 但问题仍然相同。
    • @t3ntman 那么也许你的问题是你的控制台输出没有正确显示 Unicode 字符。有一个关于here的讨论
    • 我会调查它,但我觉得奇怪的是,像“主机名”这样的本机 Windows 可执行文件会显示正确的主机名,但我的程序却没有。
    【解决方案3】:

    Windows 控制台输出是罪魁祸首。 Unicode 字符在其他非控制台输出中正确显示。谢谢大家!

    【讨论】:

      猜你喜欢
      • 2018-04-08
      • 2023-03-15
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2018-10-02
      • 2016-12-13
      相关资源
      最近更新 更多