WriteConsole() 奇怪的字符?

Posted

技术标签:

【中文标题】WriteConsole() 奇怪的字符?【英文标题】:WriteConsole() weird characters? 【发布时间】:2009-07-07 12:33:54 【问题描述】:

我使用这个 sn-p 从 dll 中创建控制台。该 dll 在游戏中加载。

CODE SNIPPET

控制台窗口创建良好。但是当我给它写东西时,我只会得到像“???D??”这样的东西。

我知道我必须使用 printf() 语法。所以我用

wprintf("%s", "test");

任何指针?

【问题讨论】:

【参考方案1】:

尝试使用:

wprintf(L"%s", "test");

因为 wprintf 将宽字符串作为输入

编辑:基于 %s 和 %S 的行为在 wprintf 中使用时会发生变化的事实:

wprintf("%s", L"test");

wprintf 中的 %s 期望 L"test" 是一个宽字符串。 我删除了格式参数上的“L”,因为 wprintf 被定义为:

int wprintf(char *fmt, ...)

【讨论】:

'void wprintf(char *,...)':无法将参数 1 从 'const wchar_t [18]' 转换为 'char *'【参考方案2】:

您正在调用 wprintf(),它是 printf() 例程的“宽字符”版本。这些“宽字符”函数有一个令人讨厌的问题,即“%s”的含义发生了变化:

printf() - "%s" 表示参数是一个普通字符串,"%S" 表示它是一个宽字符串

wprintf() - "%s" 表示参数是一个宽字符串,"%S" 表示它是一个普通字符串

所以你对 wprintf() 的调用告诉它参数是一个宽字符串,但它不是:将其更改为

printf("%s", "test");

【讨论】:

我怀疑 %s 和 %S 的含义会根据调用的函数而改变。函数之间的区别在于 wprintf 将格式作为一个宽字符串,而 printf 将一个普通字符串。 至少在 Windows 上(这就是我们在这里谈论的),它确实:见 msdn.microsoft.com/en-us/library/hf4y5e3w%28VS.100%29.aspx 这样做很容易编译相同代码的 ansi 和 unicode 版本:Tversionofprint(_T("format %s code"),_T("parameter"));【参考方案3】:

一个好习惯是使用可移植宏 _T(),当我们使用 ASCII 时它什么都不做,而当定义 UNICODE 时,它会在所有字符串前面加上 L。并且使用 _t 前置函数,它们实际上只是在我们使用 ASCII 时映射到普通函数的宏,而在定义 UNICODE 时映射到 w 前置函数。这样一来,您始终拥有可移植的代码 - 可在两个版本中使用:

_tprintf(_T("%s"),_T("test");

【讨论】:

【参考方案4】:

“%s”格式字符串告诉 wprintf 它应该将第一个参数解释为宽字符串。

为避免这些混合编码问题,您可以使用 TCHAR 宏:

LPCTSTR pName = _T("World");
_tprintf( _T("%s, %s"), _T("Hello"), pName );

【讨论】:

【参考方案5】:

您的编码错误,因为您使用的是 wstring 字符,但可能只有一个 ascii 控制台。确保您在控制台中使用 unicode 字体。

【讨论】:

啊,我不需要 unicode 支持,所以我把它重写为 ansi 函数。 他没有使用 wstring 字符作为 wprintf 参数。

以上是关于WriteConsole() 奇怪的字符?的主要内容,如果未能解决你的问题,请参考以下文章

C#格式化输出详解

如何使用 WinApi 的 WriteConsole 打印 LOCAL 字节

通过中间函数调用 WriteConsole 无法正常工作

调用 WriteConsole 时包含 stdio 会导致错误

Windows API和字符串连接[重复]

eval实现字符串化前的功能实现,有效叠加相同代码