在C ++ Builder中使用swprintf打印窄字符串

时间:2015-01-13 10:42:47

标签: c++ windows printf c++builder widestring

以下几行"按预期工作":

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

2 个答案:

答案 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;通过附加一个空字节。 (通过检查来源的确认确认。)