MingW64 的 wprintf 行为
wprintf behaviour with MingW64
我一直在为一个非常奇怪的问题挠头。
请参阅下面的示例代码:
test_c.c
#include <wchar.h>
#include <stringapiset.h>
int main (int argc, char **argv)
{
const char mystr[] = "The brown fox jumped over the lazy dog";
wchar_t wideName[MAX_PATH];
int len = MultiByteToWideChar(CP_UTF8, 0, mystr, -1, wideName, MAX_PATH-1);
wprintf( L"Length = %d - String = %s\n", len, wideName );
return 0;
}
编译命令非常简单:
gcc -static test_c.c -o test_c.exe
发生的第一件奇怪的事情是,我得到的结果因我使用的工具链而异:
- 使用 x86_64-6.3.0-release-posix-seh-rt_v5-rev2.7z, x86_64-7.3.0-release-posix-seh-rt_v5-rev0, or x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z(全部使用较旧的 Ming-W64 版本),我得到了预期的结果:
Length = 39 - String = The brown fox jumped over the lazy dog
- 使用 winlibs-x86_64-posix-seh-gcc-10.2.0-llvm-10.0.1-mingw-w64-8.0.0-r1 or winlibs-x86_64-posix-seh-gcc-11.2.0-llvm-12.0.1-mingw-w64-9.0.0-r1(使用 MingW-64 8.0.0 和 9.0.0)我得到这个:
Length = 39 - String = T
更奇怪的是,如果我现在把它变成一个 C++ 文件:
test_cpp.cpp
//#include <stdio.h>
#include <cwchar>
#include <stringapiset.h>
int main (int argc, char **argv)
{
const char mystr[] = "The brown fox jumped over the lazy dog";
wchar_t wideName[MAX_PATH];
int len = MultiByteToWideChar(CP_UTF8, 0, mystr, -1, wideName, MAX_PATH-1);
wprintf( L"Length = %d - String = %s\n", len, wideName );
return 0;
}
如果我使用相同的编译命令:
g++ -static test_cpp.cpp -o test_cpp.exe
然后我得到了更奇怪的东西:
- 使用上面提到的所有工具链,我得到:
Length = 39 - String = T
- 但是,如果我取消对 #include
的注释,那么我会得到类似于普通旧 C 示例的内容(结果因工具链而异)
我做错了什么吗?
有办法解决这个问题吗?
谢谢!
Am I doing something wrong ? Is there a way to fix this ?
是的。 %s
用于打印 char*
。要打印 wchar_t*
,请使用 %ls
.
我一直在为一个非常奇怪的问题挠头。 请参阅下面的示例代码:
test_c.c
#include <wchar.h>
#include <stringapiset.h>
int main (int argc, char **argv)
{
const char mystr[] = "The brown fox jumped over the lazy dog";
wchar_t wideName[MAX_PATH];
int len = MultiByteToWideChar(CP_UTF8, 0, mystr, -1, wideName, MAX_PATH-1);
wprintf( L"Length = %d - String = %s\n", len, wideName );
return 0;
}
编译命令非常简单:
gcc -static test_c.c -o test_c.exe
发生的第一件奇怪的事情是,我得到的结果因我使用的工具链而异:
- 使用 x86_64-6.3.0-release-posix-seh-rt_v5-rev2.7z, x86_64-7.3.0-release-posix-seh-rt_v5-rev0, or x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z(全部使用较旧的 Ming-W64 版本),我得到了预期的结果:
Length = 39 - String = The brown fox jumped over the lazy dog
- 使用 winlibs-x86_64-posix-seh-gcc-10.2.0-llvm-10.0.1-mingw-w64-8.0.0-r1 or winlibs-x86_64-posix-seh-gcc-11.2.0-llvm-12.0.1-mingw-w64-9.0.0-r1(使用 MingW-64 8.0.0 和 9.0.0)我得到这个:
Length = 39 - String = T
更奇怪的是,如果我现在把它变成一个 C++ 文件:
test_cpp.cpp
//#include <stdio.h>
#include <cwchar>
#include <stringapiset.h>
int main (int argc, char **argv)
{
const char mystr[] = "The brown fox jumped over the lazy dog";
wchar_t wideName[MAX_PATH];
int len = MultiByteToWideChar(CP_UTF8, 0, mystr, -1, wideName, MAX_PATH-1);
wprintf( L"Length = %d - String = %s\n", len, wideName );
return 0;
}
如果我使用相同的编译命令:
g++ -static test_cpp.cpp -o test_cpp.exe
然后我得到了更奇怪的东西:
- 使用上面提到的所有工具链,我得到:
Length = 39 - String = T
- 但是,如果我取消对 #include
的注释,那么我会得到类似于普通旧 C 示例的内容(结果因工具链而异)
我做错了什么吗? 有办法解决这个问题吗?
谢谢!
Am I doing something wrong ? Is there a way to fix this ?
是的。 %s
用于打印 char*
。要打印 wchar_t*
,请使用 %ls
.