Как преобразовать wchar_t в NSString? - PullRequest
9 голосов
/ 13 октября 2011

У меня есть буфер wchar_t [100].Иногда это необходимо для букв Unicode, иногда нет.

Мне нужно преобразовать его в NSString.

Я использую NSString *str = [NSString string:(char *)buffer]; для преобразования.

Когда я пытаюсь выполнить NSLog мою строку NSString, иногда она дает правильный результат, а иногда нет.

Я что-то пропустил?

Спасибо!

Ответы [ 3 ]

15 голосов
/ 13 октября 2012

Мой конвертер для "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];
}
13 голосов
/ 13 октября 2011

Все так, как сказал 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 «ноль» означает 32-битное значение, равное нулю).
  • someEncoding - это кодировка , используемая строкой в ​​буфере. Попробуйте NSUTF32StringEncoding, NSUTF32LittleEndianStringEncoding, NSUTF32BigEndianStringEncoding.
5 голосов
/ 13 октября 2011

Возможно, это прояснит ситуацию.

C89 ввел новый целочисленный тип, wchar_t.Это похоже на символ, но обычно «шире».Во многих системах, включая 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 - это typedef для другого целочисленного типа в C. В C ++ wchar_t - это встроенный целочисленный тип.На практике это означает, что вам необходимо #include в C при использовании широких символов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...