是否可以通过printf
成员函数将char*
参数打印到UnicodeString对象中?
以下代码给出了错误的结果(损坏的字符串):
UnicodeString s;
s.printf(L"%s", "hello");
如果我指定L"hello"
而不是"hello"
,它会按预期工作(对我来说很奇怪,为什么它适用于"%s"
说明符,我认为它应该是"%ls"
)。
通过将s
字符串分配给表单标签的Caption属性,在Embarcadero RAD Studio XE和10 Seattle上测试。
答案 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 #124607和RSP-13285)。