【问题标题】:GetWindowText Can't Handle TradeMark SymbolGetWindowText 无法处理商标符号
【发布时间】:2015-06-14 03:28:26
【问题描述】:
HWND ForeWindow = GetForegroundWindow();
wchar_t WindowTxt[1024] = { L'\0' };
GetWindowTextW(ForeWindow, WindowTxt, 1024);
wprintf(L"%s\n", WindowTxt);
std::wstring Str(WindowTxt);
std::wcout << L"Wnd: " << Str << L"\n";

使用上面的代码获取Skype窗口“Skype™”我得到输出:

“Skype?”

(wcout 行执行失败)

1)为什么GetWindowText的宽字符版本无法处理这个字符

2)为什么std::wstring解析wchar_t数组失败,然后打印到控制台

【问题讨论】:

  • GetWindowText 不是问题。控制台停留在 1980 年代,具有石砖的用户友好性。您必须切换到更好的编码,如 utf-8,使用 SetConsoleCP(CP_UTF8)。并更改其字体。
  • 写入文件而不是打印到控制台会产生完全相同的问题。
  • 调试器告诉你什么?
  • 写入控制台,而不是设置流语言环境是问题所在,你们让我看输出而不是代码,我很快就发现了语言环境问题,谢谢。
  • 另请查看MessageBoxW()OutputDebugStringW()

标签: c++ windows unicode encoding


【解决方案1】:

CMD 控制台不能很好地处理 Unicode。将输出发送到一个文件并在编辑器中打开它,我怀疑你会得到你期望的实际字符。

【讨论】:

  • 这是问题所在,另请注意,当我第一次尝试写入文件时,我没有设置语言环境,导致同样的问题。设置语言环境后,使用 std::wofstream.imbue(std::locale("")) 它可以正常工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 2020-01-31
  • 2017-04-20
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多