stringWithFormat 和 %S 问题

发布于 2024-11-14 00:36:32 字数 284 浏览 3 评论 0原文

这是我的代码。

std::wstring sourceString = L"test\n newline.";
NSString* transformedString = [NSString stringWithFormat:@"%S", sourceString.c_str()];

我想让两个字符串的内容相同,但transformedString相当于@“t”。 我怎样才能用最少的编辑来解决这个问题?

(由于 unicode 问题,我必须使用 wstring。)

Here is my code.

std::wstring sourceString = L"test\n newline.";
NSString* transformedString = [NSString stringWithFormat:@"%S", sourceString.c_str()];

I intended two strings' contents to be same but transformedString is equivalent to @"t".
How can I fix this with minimal edit?

(I have to use wstring because of unicode issue.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吃颗糖壮壮胆 2024-11-21 00:36:32

在 Mac OS X/iOS 上,wchar_t 为 32 位宽(即它表示 UTF-32 字符,而不是 UTF-16 字符。)%S 对应于以 null 结尾的字符unichar 数组,而 unichar 是 16 位宽,而不是 32 位宽,因此字符 't' 出现在 NSString 有一个尾随空字符(或 Big Endian 目标上的前导空字符)导致字符串被截断。

要转换为 NSString,请尝试:

NSString * transformedString = [[NSString alloc]
    initWithBytes: sourceString.c_str()
    length:        sourceString.size() * sizeof(wchar_t)
    encoding:      NSUTF32StringEncoding];

请注意,上面假设 wchar_t 包含 UTF-32 值,这在 Mac OS X 和大多数(全部?) * NIX,但在 Windows 上为 false(其中 wchar_t 是 16 位,相当于 unichar。)

On Mac OS X/iOS, wchar_t is 32 bits wide (i.e. it represents UTF-32 characters, not UTF-16 characters.) %S corresponds to a null-terminated unichar array, and unichar is 16 bits wide, not 32 bits wide, so the character 't' appears to NSString to have a trailing null character (or leading null character on Big Endian targets) causing the string to be truncated.

To convert to an NSString, try:

NSString * transformedString = [[NSString alloc]
    initWithBytes: sourceString.c_str()
    length:        sourceString.size() * sizeof(wchar_t)
    encoding:      NSUTF32StringEncoding];

Note that the above assumes that wchar_t holds a UTF-32 value, which is true on Mac OS X and most (all?) *NIXes, but false on Windows (where wchar_t is 16 bits, equivalent to unichar.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文