Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在DbgView中调试UTF-16输出?_C++ - Fatal编程技术网

C++ 如何在DbgView中调试UTF-16输出?

C++ 如何在DbgView中调试UTF-16输出?,c++,C++,我想在DbgView中显示UTF-16字符串,如下所示: wchar_t nameholder = L'שלום עולם'; 但是我不能用OutputDebugStringW()实现这一点。你有什么解决办法吗?首先,这是:wchar_t nameholder=L'ש㪞עםם'在任何编码中都不会编译。你的意思是: const wchar_t* nameholder = L"שלום עולם"; 在任何情况下,真正解决方案的根源与我刚才所说的相同 不要将Unicode字符(普通ASCII范围

我想在DbgView中显示UTF-16字符串,如下所示:

wchar_t nameholder = L'שלום עולם';

但是我不能用
OutputDebugStringW()
实现这一点。你有什么解决办法吗?

首先,这是:
wchar_t nameholder=L'ש㪞עםם'在任何编码中都不会编译。你的意思是:

const wchar_t* nameholder = L"שלום עולם";
在任何情况下,真正解决方案的根源与我刚才所说的相同

<>不要将Unicode字符(普通ASCII范围以上的字符)硬编码为C++源文件。在编译器、ide编辑器、源代码repo、diffing工具和具有不同设置的团队成员之间,将unicode字符放入源代码文件不是一个好主意

因此,与此相反:

const wchar_t* nameholder = L"שלום עולם";
像这样使用unicode转义

const wchar_t* nameholder = L"\u05e9\u05dc\u05d5\u05dd\u0020\u05e2\u05d5\u05dc\u05dd";
然后OutputDebugString将工作得更好:

OutputDebugStringW(nameholder);
免责声明:我从未在DbgView中使用过希伯来语,但它应该可以工作。具有上述功能的OutputDebugString在Visual Studio中不起作用:

'ConsoleApplication26.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ucrtbased.dll'. 
The thread 0x2248 has exited with code 0 (0x0).
שלום עולם 
更新


我尝试了Boris的建议,并尝试让DbgView运行我建议的更改。我用OutputDebugStringW尝试了utf-16,用OutputDebugStringA尝试了utf-8。简短回答:DbgView只是把它弄坏了。所以,我所说的几乎都是毫无意义的。我将继续支持这样一个事实,即在源代码中应该避免使用非ascii字符。但是我没有DbgView的解决方案。

这让我很好奇,所以我做了一个小实验,在我的Win7x64机器上用VS2017构建并运行以下代码

#include <windows.h>

int main()
{
    static const wchar_t shalomolam[] = { 0x05E9, 0x05DC, 0x05D5, 0x05DD, 0x0020, 0x05E2, 0x05D5, 0x05DC, 0x05DD, 0xD, 0xA, 0 };
    static const wchar_t zdravstvuimir[] = { 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443, 0x0439, 0x0020, 0x041C, 0x0438, 0x0440, 0xD, 0xA, 0 };
    OutputDebugStringW(L"Hello World\r\n");
    OutputDebugStringW(shalomolam);
    OutputDebugStringW(zdravstvuimir);
    return(0);
}
#包括
int main()
{
静态常数wchar_t shalomolam[]={0x05E9、0x05DC、0x05D5、0x05DD、0x0020、0x05E2、0x05D5、0x05DC、0x05DD、0xD、0xA、0};
静态常量wchar_t zdravstvuimir[]={0x0417、0x0434、0x0440、0x0430、0x0432、0x0441、0x0442、0x0432、0x0443、0x0439、0x0020、0x041C、0x0438、0x0440、0xD、0xA、0};
OutputDebugStringW(L“Hello World\r\n”);
输出(沙洛莫林);
OutputDebugStringW(zdravstvuimir);
返回(0);
}
令人惊讶的是,我只能打印英语或系统语言环境的Unicode字符,将系统设置为希伯来语言环境,希伯来人可以打印,但俄语字符转换为“?”,将其设置为俄语,希伯来人也会这样做。知道这可能与源文件编码、Visual Studio等有关(我同意@selbie的说法),我用十六进制编辑器仔细检查了二进制文件,字符串在那里,它们很好,这不取决于我运行构建的系统区域设置。这种“?”替换在dbgview和Visual Studio调试输出中都会发生


TBH,到目前为止,我从未尝试过将非英语Unicode字符输入OutputDebugString,但是,嘿,我想你的答案是-如果你想要一种特定的语言输出用于调试目的-将你的语言环境切换到该语言。否则(例如,在使用多种语言的情况下,或者如果您想在用户的计算机上使用dbgview收集日志),您可能会觉得运气不好。

查看备注。等待DbgView赶上进度不是很实际。考虑日志记录。上面的成功取决于您保存了源文件的编码。尝试将源文件保存为UTF-16。“也看看我的答案吧!”塞尔比也读了一遍我的答案。我知道。我同意你的回答。这就是为什么我用十六进制编辑器再次检查二进制文件,以防万一。@selbie-你知道吗。。。为了安全起见。。。我刚刚用希伯来语和俄语的原始数据运行了它,当我的系统语言环境设置为希伯来语时,我仍然只能正确地打印希伯来语(以及英语)。用原始数据编辑代码的答案。把“源代码中的硬编码unicode字符”放在一边(我同意,这不是一个好主意),我在我的Win7x64上尝试了这一点,使用VS2017构建代码,在接收端使用VS2017或dbgview 4.79,我最肯定的是,我的系统区域设置之外的所有字符都被“?”替换。可能不会进一步研究这个问题(是dbgview?VS?Win7吗?他们在上面的更新版本中修复了吗?),但会很好奇地阅读其他结果。@BorisLipschitz-这是关于旧版本Windows的一个好观点。这可能是字体或控制问题。在过去10年中,Windows对所有字体中可用的unicode字符以及所有文本控件中呈现的unicode字符进行了巨大改进。其中许多改进是在Windows7发布很久之后进行的。在Windows 10中,除了控制台cmd窗口本身之外,呈现unicode字符非常可靠。@BorisLipschitz-但是,dbgview仍然管理输出,无论我是使用OutputDebugStringW还是通过OutputDebugStringA向其提供utf16还是utf-8。嘿,感谢您的帮助,所以得出结论,我无法在dbgview中打印utf16?我在我的项目中并没有真正使用核心希伯来语,只是举个例子。@yoni,只要系统语言环境设置为希伯来语,它就会在dbgview中打印希伯来语,而且对大多数以色列用户来说是这样,但是,嘿,为什么要麻烦呢?这些都是调试消息。用多种语言编写它们有什么意义?还是需要打印实际数据以进行调试?因为如果是这样的话,嘿,把它扔了。