将char * string参数打印到UnicodeString对象中

时间:2015-12-29 14:37:21

标签: c++ char c++builder unicode-string

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

UnicodeString::printf()是C风格vsnwprintf()函数的包装器。在所有C ++ Builder的C风格打印函数中,%s使用非标准实现 - 它取决于函数的窄版本还是宽版本,而在C标准中,%s始终需要char*

在这种情况下,UnicodeString::printf()会调用广角vsnwprintf()功能,因此%s需要wchar_t*(但%ls始终需要wchar_t*根据C标准,%hs总是期望按照Borland标准char*。这样,在String::printf()(以及其他打印方法)中,%s应该与String的{​​{1}} - char*的字符类型相匹配,AnsiString对于wchar_t* *。

*但是,在Android上,Embarcadero尚未实现广角UnicodeString,只有窄版vsnwprintf(),因此vsnprintf()(和其他打印方法)最终需要UTF-8 { {1}} UnicodeString::printf()! (我报告为QC #124607RSP-13285)。