将 char* 字符串参数打印到 UnicodeString object

printing char* string argument into UnicodeString object

是否可以通过 printf 成员函数将 char* 参数打印到 UnicodeString object 中?

以下代码给出了错误的结果(损坏的字符串):

UnicodeString s;
s.printf(L"%s", "hello");

如果我指定 L"hello" 而不是 "hello" 它会按预期工作(对我来说很奇怪,为什么它与 "%s" 说明符一起工作,我认为它应该是 "%ls" ).

通过将 s 字符串分配给表单标签的标题 属性,在 Embarcadero RAD Studio XE 和 10 Seattle 上进行了测试。

UnicodeString::printf() 是 C-style vsnwprintf() 函数的包装器。在所有 C++Builder 的 C-style 打印函数中,%s 使用 non-standard 实现——这取决于调用的函数是 Narrow 还是 Wide 版本,而在 C 标准中, %s 总是期望 char* 而不是。

在这种情况下,UnicodeString::printf() 调用 Wide vsnwprintf() 函数,因此 %s 需要一个 wchar_t*(但是,%ls 总是需要一个 wchar_t*,根据 C 标准,%hs 总是期望 char*,根据 Borland 标准)。这样,在 String::printf()(和其他打印方法)中,%s 应该与 String - char* 的字符类型匹配 AnsiStringwchar_t* 对于 UnicodeString*.

*但是,在 Android 上,Embarcadero 还没有实现 Wide vsnwprintf(),只有 Narrow vsnprintf(),所以 UnicodeString::printf()(和其他打印方法)最终期待 %s 的 UTF-8 char*! (我报告为 QC #124607 and RSP-13285)。