如何将wchar_t转换为NSString?

Use*_*234 10 macos cocoa objective-c

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

我需要将其转换为NSString.

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

当我尝试NSLog我的NSString时,有时它得到正确的结果,但有时不是.

我错过了什么?

谢谢!

use*_*086 16

我的转换器为"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];
}
Run Code Online (Sandbox Code Playgroud)

  • @ user1351086我认为`wcharFromString`的正确实现是`+(const wchar_t*)wcharFromString:(NSString*)string {return(const wchar_t*)[string cStringUsingEncoding:NSUTF32LittleEndianStringEncoding]; }` (5认同)

Jer*_*myP 13

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

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

哪里:

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


Tot*_*mus 5

也许这会清除一切。

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

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

在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