如何将wchar_t转换为NSString?

时间:2011-10-13 11:14:11

标签: objective-c macos cocoa

我有wchar_t buffer [100]。有时需要Unicode字母,有时则不需要。

我需要将其转换为NSString。

我正在使用NSString *str = [NSString string:(char *)buffer];来转换它。

当我尝试NSLog我的NSString时,有时会得到正确的结果,但有时却没有。

我错过了什么吗?

谢谢!

3 个答案:

答案 0 :(得分:15)

我的转换器为“char”,“wchar_t”,“NSString”。使用和享受。

//-=(W)=-

+(NSString *)stringFromChar:(const char *)charText
{
    return [NSString stringWithUTF8String:charText];
}

+(const char *)charFromString:(NSString *)string
{
    return [string cStringUsingEncoding:NSUTF8StringEncoding];
}

+(NSString *)stringFromWchar:(const wchar_t *)charText
{
    //used ARC
    return [[NSString alloc] initWithBytes:charText length:wcslen(charText)*sizeof(*charText) encoding:NSUTF32LittleEndianStringEncoding];
}

+(const char /*wchar_t*/ *)wcharFromString:(NSString *)string
{
    return  [string cStringUsingEncoding:NSUTF8StringEncoding];
}

答案 1 :(得分:13)

一切都像Totumus Maximus所说,但另外你需要知道缓冲区中的字符是如何编码的。由于wchar_t是32位,您可能有一些32位编码,其中UTF32-LE最有可能。你想要获得NSString的目的是:

NSString* result = [[NSString alloc] initWithBytes: (const void*)buffer 
                                            length: sizeof(wchar_t) * numberOfCharsInBuffer
                                          encoding: someEncoding];

其中:

  • numberOfCharsInBuffer是要解码的缓冲区中wchar_t的数量。上面的方法并不假设字符串是空终止的,并且如果它们出现在您指定的长度之前,将很乐意尝试将空值放入NSString中(注意,使用wchar_t“null”表示32位值为零)。
  • someEncoding是缓冲区中字符串使用的encoding。试试NSUTF32StringEncodingNSUTF32LittleEndianStringEncodingNSUTF32BigEndianStringEncoding

答案 2 :(得分:5)

也许这会让事情变得清晰。

C89引入了一个新的整数类型wchar_t。这类似于char,但通常“更宽”。在许多系统上,包括Windows,wchar_t是16位。这是使用早期版本的Unicode标准实现其Unicode支持的系统的典型,该标准最初定义的字符少于65,535个字符。后来扩展了Unicode以支持历史和特殊用途的字符集,所以在某些系统上,包括Mac OS X和iOS,wchar_t类型的大小为32位。这通常记录很少,但您可以使用这样的简单测试来找出:

// how big is wchar_t?
NSLog(@"wchar_t is %u bits wide", 8 * sizeof(wchar_t));

在Mac或iPhone上,这将打印“wchar_t为32位宽”。此外,wchar_t是C中另一个整数类型的typedef。在C ++中,wchar_t是内置整数类型。实际上,这意味着在使用宽字符时需要在C中进行#include。

参考:http://blog.ablepear.com/2010/07/objective-c-tuesdays-wide-character.html