考虑这个示例程序:
#include <cstdio> #include <cwchar> #include <string> int main() { std::string narrowstr = "narrow"; std::wstring widestr = L"wide"; printf("1 %s \n",narrowstr.c_str()); printf("2 %ls \n",widestr.c_str()); wprintf(L"3 %s \n",narrowstr.c_str()); wprintf(L"4 %ls \n",widestr.c_str()); return 0; }
其输出是:
1 narrow 2 wide
我在想:
>为什么3& 4没有打印
> 1& 3,2& 4之间的区别是什么.
>如果在utf8中是narrowstr,而utf16中的widestr是否有差异呢?
解决方法
请注意,您正在使用C流. C流具有称为“方向”的非常特殊的质量.流是无方向,宽或窄.方向由对任何特定流的第一个输出决定(参见
http://en.cppreference.com/w/cpp/io/c了解C I / O流的总结)
在你的情况下,stdout从无方向开始,通过执行第一个printf,你设置得很窄.一旦狭窄,它就卡住了,wprintf失败了(检查它的返回码!).更改C流的唯一方法是将其自由打开,这与stdout不兼容.这就是为什么3和4没有打印.
1和3之间的区别是1是一个窄输出函数,它使用窄字符串转换说明符%s:它从char数组读取字节并将字节发送到字节流. 3是具有窄字符串转换说明符%s的宽输出函数:它首先从char数组读取字节,将mbtowcs写入wchar_ts,然后将wchar_ts发送到宽流中,然后将其写入字节或多字节序列,然后将其推送写入标准出来
最后,如果widestr在utf16,你必须使用Windows,所有的赌注都关闭;在该平台上除了ASCII之外的任何东西都支持很少.你可以给出并使用WinAPI(你可以通过标准的C 11获得一些Unicode的东西,甚至可以使用这个C输出,使用魔术字_setmode(_fileno(stdout),_O_U16TEXT)),这已经被讨论了足够的时间)