我有wchar_t buffer [100]。有时需要Unicode字母,有时则不需要。
我需要将其转换为NSString。
我正在使用NSString *str = [NSString string:(char *)buffer];
来转换它。
当我尝试NSLog我的NSString时,有时会得到正确的结果,但有时却没有。
我错过了什么吗?
谢谢!
答案 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。试试NSUTF32StringEncoding
,NSUTF32LittleEndianStringEncoding
,NSUTF32BigEndianStringEncoding
。答案 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