【问题标题】:basic_string<wchar_t> UTF16 encoding to NSStringbasic_string<wchar_t> UTF16 编码到 NSString
【发布时间】:2011-07-27 05:36:33
【问题描述】:

从具有 UTF16 编码的 C++ basic_string&lt;wchar_t&gt; 对象转换为 Objective-C NSString 对象的最佳方法是什么?

我可以像这样从 wchar_t* 转换为 char* 并且仍然让 stringWithCString 正确使用字符串吗?

[NSString stringWithCString:(char*)wideCharBasicString.c_str() encoding:NSUTF16StringEncoding];

谢谢你, 谢恩

【问题讨论】:

  • iOS 上的wchar_t 是 32 位宽的 IIRC。
  • 我刚刚验证它确实是 32 位的。我将如何使用 UTF32 编码使用相同的方法?
  • 所以 NSString *myNSString = [NSString stringWithFormat:@"%S",wideCharBasicString.c_str()];似乎可以解决问题。 stringWIthCString 只给了我一个空的 NSString。此外,如果有人需要像我一样使用它,标志 -fshort-wchar 在 iOS 上将 wchar_t 转换为 16 位。
  • 一般来说,如果你保证你的原始字符串是UTF-16(不仅仅是UCS-2),你可以把它复制到uint16_t[],然后使用iconv创建所需的编码(如果它不同于 UTF-16),然后从那里构造您的 NSString。

标签: iphone objective-c encoding nsstring wchar-t


【解决方案1】:

如果缓冲区是 UTF-16 编码的,您可以这样做:

    NSData* data = [[[NSData alloc] initWithBytesNoCopy:buffer
                                                 length:length
                                           freeWhenDone:NO] autorelease];
    NSString* result = [[NSString alloc] initWithData:data
                                             encoding:NSUTF16LittleEndianStringEncoding];

stringWithCString 看起来像是在多字节字符缓冲区上出现问题,在它找到的第一个 NULL 字节处停止。

[更新]

我向苹果提交了一个错误,这是预期的行为,显然。 stringWithCString 仅支持 8 位编码,将在第一个零字节处停止。

【讨论】:

  • 好吧,它已经过时了,但我遇到了同样的情况:我确认 stringWithCString 在 IOS 5.1 中无法与 UTF16 一起使用
【解决方案2】:

我使用以下方法进行转换:

NSString *myNSString = [NSString stringWithFormat:@"%S",wideCharBasicString.c_str()]; 

另外,如果有人需要像我一样使用它,标志 -fshort-wchar 在 iOS 上会将 wchar_t 转换为 16 位。

【讨论】:

    【解决方案3】:

    这是最不丑的方式(utf16):

    NSString* nsstr = [NSString stringWithCharacters:str.c_str() length:str.length()];
    

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 2015-07-23
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 2011-02-06
      • 2011-12-04
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多