Как преобразовать значение unichar в NSString в Objective C?

Я сказал бы, что эта практика способствует концентрации Ваших усилий на 'пространстве задач', а не 'пространстве решения'. Управление решением на стадии становления (дизайн) путем изучения и действительно узнавания и понимает домен. Один из методов (взятый от XP) был бы записью историй, которые происходят в проблемной области. От них можно определить варианты использования и объекты для дизайна. Они 'появляются' и говорят Вам, какие потребности быть в решении, и как они должны будут взаимодействовать друг с другом.

31
задан Quinn Taylor 21 November 2009 в 16:32
поделиться

2 ответа

Поскольку 0xce91 находится в формате UTF-8, а % C ожидает, что он будет в UTF-16, простое решение, подобное приведенному выше, выиграло не работает. Чтобы stringWithFormat: @ "% C" работал, вам необходимо ввести 0x391 , который является юникодом UTF-16.

Чтобы создать строку из кодировки UTF-8 unichar вам нужно сначала разделить юникод на октеты, а затем использовать initWithBytes: length: encoding .

unichar utf8char = 0xce91; 
char chars[2];
int len = 1;

if (utf8char > 127) {
    chars[0] = (utf8char >> 8) & (1 << 8) - 1;
    chars[1] = utf8char & (1 << 8) - 1; 
    len = 2;
} else {
    chars[0] = utf8char;
}

NSString *string = [[NSString alloc] initWithBytes:chars
                                            length:len 
                                          encoding:NSUTF8StringEncoding];
21
ответ дан 27 November 2019 в 21:46
поделиться

Приведенный выше ответ хорош, но не учитывает символы UTF-8 длиной более 16 бит, например символ многоточия - 0xE2,0x80,0xA6. Вот корректировка кода:

if (utf8char > 65535) {
   chars[0] = (utf8char >> 16) & 255;
   chars[1] = (utf8char >> 8) & 255;
   chars[2] = utf8char & 255; 
   chars[3] = 0x00;
} else if (utf8char > 127) {
    chars[0] = (utf8char >> 8) & 255;
    chars[1] = utf8char & 255; 
    chars[2] = 0x00;
} else {
    chars[0] = utf8char;
    chars[1] = 0x00;
}
NSString *string = [[[NSString alloc] initWithUTF8String:chars] autorelease];

Обратите внимание на другой метод инициализации строки, который не требует параметра длины.

2
ответ дан 27 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: