以下几行"按预期工作":
wchar_t u[50], v[50];
swprintf(u, 50, L"%s", L"hello");
swprintf(v, 50, L"%ls", L"goodbye");
MessageBoxW(NULL, u, v, MB_OK); // output: MessageBox showing "hello" and "goodbye"
有没有办法打印一个窄字符串,这个文档在哪里? E.g。
swprintf(u, 50, L"%?", "hello");
C ++标准指定(通过引用C标准)在wprintf
函数族中,%s
指定了一个char
的字符串(以多字节编码,例如UTF-8) ),%ls
指定一个wchar_t
的字符串。
因此,RTL(C ++ Builder提供的运行时库实现)显然不符合标准。
背景:我实际上尝试使用UnicodeString::sprintf
,但是将繁重的工作委托给vswprintf
。
答案 0 :(得分:2)
这不是一个真正的答案,而是更多的元素汇编。
网站http://www.cplusplus.com/很明确:对于wprintf
系列: ...所有格式说明符与printf中的含义相同;因此,%lc应用于写一个宽字符(而不是%c),以及%ls用于宽字符串(而不是%s)
gcc和clang都符合上述规范
MSVC并且根据OP Borland C ++不符合并接受%s
作为宽字符串。
答案 1 :(得分:1)
我设法在RTL源代码的vprinter.c
文件中找到了这个(C ++ Builder附带了自己的RTL,它没有引用MS):
/* The 's' conversion takes a string (char *) as
* argument and copies the string to the output
* buffer.
*
* Note: We must handle both narrow and wide versions
* depending on the flags specified and the version called:
*
* Format printf wprintf
* ----------------------------------------
* %s narrow wide
* %S wide narrow
* %hs narrow narrow
* %hS narrow narrow
* %ls wide wide
* %lS wide wide
*
*/
所以代码:
swprintf(v, 50, L"%hs", "hello");
生成正确的输出。
但是,这不会进行任何UTF-8转换;狭窄的角色被扩大了#34;通过附加一个空字节。 (通过检查来源的确认确认。)