Как преобразовать числовой ввод в NSString, содержащий умлаут? (так далее.)

Чтобы преобразовать числовое десятичное значение x в диапазоне от 97 до 122 в NSString, представляющее этот символ ASCII, можно просто вызвать:

[ NSString stringWithFormat: @"%c", x ]

Как создать NSString для символов, отличных от ASCII, таких как:

ä , è , ñ , à , é , ç , ĝ , ŝ , š , ĥ , þ , ð , ĵ , ü , ś , ź , ż

из строго числового входного значения? (например, десятичный UInt32, не скопированный и не требующий какого-либо другого типа данных NSString, Objective-C или Core Foundation в таблице поиска).

Есть ли какой-нибудь онлайн-инструмент, который будет искать любые магические десятичные числовые значения (UTF-foo?), Требуемые для каждого символа?


person hotpaw2    schedule 19.02.2014    source источник
comment
Используйте %C вместо %c. %C поддерживает больший диапазон.   -  person rmaddy    schedule 19.02.2014
comment
Ваш вопрос противоречив. Если вам нужны символы без таблицы поиска, где вы ожидаете найти свои числа? Я имею в виду, что вы можете найти коды в онлайн-таблицах, но зачем искать их, если вы можете просто ввести их в литерал NSString?   -  person Hot Licks    schedule 19.02.2014
comment
Не забудьте часть 2: существует ли онлайн-утилита для поиска магических десятичных констант, необходимых для %C? Или можно выполнить поиск локально в веб-браузере, используя несколько строк javascript?   -  person hotpaw2    schedule 19.02.2014
comment
@HotLicks: я передаю числовое значение фиксированной длины по аппаратной ссылке. 8-битный ЦП не знает литералов NSString.   -  person hotpaw2    schedule 19.02.2014
comment
Затем передайте код символа. Если вы ограничены европейскими языками, вы, вероятно, прекрасно справитесь с UTF16 — 16 бит на символ.   -  person Hot Licks    schedule 20.02.2014


Ответы (2)


Если у вас есть значение Unicode, вы можете сделать

uint32_t code = 0x0125; // U+0125 is 'ĥ'
NSString *s = [[NSString alloc] initWithBytes:&code length:4 
                            encoding:NSUTF32LittleEndianStringEncoding];

Это работает даже для Unicodes за пределами «базовой многоязычной плоскости», например

uint32_t code = 0x01F604; // ???? = SMILING FACE WITH OPEN MOUTH AND SMILING EYES

В приведенном выше коде предполагается, что целые числа хранятся в порядке байтов с прямым порядком байтов (что имеет место для всех современных процессоров под управлением iOS или OS X). Независимый от порядка байтов метод

uint32_t code = OSSwapHostToLittleInt32(0x0125);

В Xcode вы можете искать Unicodes в «Средстве просмотра символов» из меню «Редактировать -> Специальные символы ...». Конечно, есть также таблицы для всех Unicodes в таблицах кодов символов Unicode 6.3.

person Martin R    schedule 19.02.2014
comment
Или вы можете просто включить символ между кавычками в литерал NSString. - person Hot Licks; 19.02.2014
comment
@HotLicks OP заявляет, что у них есть числовое значение, которое необходимо преобразовать. - person rmaddy; 19.02.2014
comment
Они также сказали, как создать NSString для символов, отличных от ASCII, таких как:... - person Hot Licks; 19.02.2014
comment
@ hotpaw2: В Xcode перейдите в «Правка» -> «Специальные символы» .... Появится окно просмотра символов. Выберите «Настроить список…» во всплывающем меню в верхнем левом углу. Добавить кодовые таблицы -> Юникод. Теперь выберите Unicode в левой части окна просмотра символов. (Сравните ответ Нитина Гохеля с stackoverflow.com/questions/17781457/) - person Martin R; 19.02.2014

Вы можете использовать

[NSString stringWithFormat:@"%C", ch ];

с прописными буквами %C для символов Юникода. См. здесь!

person Merlevede    schedule 19.02.2014
comment
Хотя я предложил это в комментарии, важно отметить, что это работает только с символами со значением Unicode до \UFFFF. Решение Мартина также может обрабатывать более высокие символы. - person rmaddy; 19.02.2014
comment
@rmaddy Извините, я не заметил вашего комментария, пока не закончил свой. - person Merlevede; 19.02.2014
comment
Я почти уверен, что uint32_t Мартина не может обрабатывать значения юникода выше 0xffff. ;-) - person Amin Negm-Awad; 19.02.2014
comment
@AminNegm-Awad: Интересно, что заставляет тебя так думать? 0x01F604 больше, чем 0xFFFF, и я проверил свой код перед публикацией. (Кстати, максимально возможное значение uint32_t равно 0xFFFFFFFF`). - person Martin R; 20.02.2014
comment
Boing Неправильный подсчет: 16 вместо 32. - person Amin Negm-Awad; 20.02.2014