将 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*
的字符类型匹配 AnsiString
,wchar_t*
对于 UnicodeString
*.
*但是,在 Android 上,Embarcadero 还没有实现 Wide vsnwprintf()
,只有 Narrow vsnprintf()
,所以 UnicodeString::printf()
(和其他打印方法)最终期待 %s
的 UTF-8 char*
! (我报告为 QC #124607 and RSP-13285)。
是否可以通过 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*
的字符类型匹配 AnsiString
,wchar_t*
对于 UnicodeString
*.
*但是,在 Android 上,Embarcadero 还没有实现 Wide vsnwprintf()
,只有 Narrow vsnprintf()
,所以 UnicodeString::printf()
(和其他打印方法)最终期待 %s
的 UTF-8 char*
! (我报告为 QC #124607 and RSP-13285)。