Вопрос по ios, uitextview, unicode, nsstring – Вставка Unicode Hyphen-minus в строку вызывает ошибку

0

Я пытаюсь вставить символ дефис-минус Юникода в текстовую строку. Я вижу "Неверный универсальный персонаж" ошибка со следующим:

u + 002D (дефис-минус)

[textViewContent insertString:@"\u002D" atIndex:cursorPosition.location];

Тем не менее, они работают нормально:

U + 2212 (минус)

[textViewContent insertString:@"\u2212" atIndex:cursorPosition.location];

U + 2010 (дефис)

[textViewContent insertString:@"\u2010" atIndex:cursorPosition.location];

Я прокомментировал некоторые из существующих обсуждений Unicode здесь, но я не нашел ни одного, который объяснял бы, что отличается среди моих примеров, что приводит к ошибке первого. Понимание высоко ценится.

Странно ... Меня больше беспокоит "\", чем "-". Надеюсь, вы решили все ваши проблемы. Jeffery Thomas
Просто из любопытства, почему ты хочешь использовать@"\u002D" вместо того@"-"? Jeffery Thomas
Мое намерение состояло в том, чтобы использовать Unicode, чтобы предотвратить любую двусмысленность, которая могла бы произойти из-за использования других языков или клавиатур. DenVog

Ваш Ответ

1   ответ
2

вание. В C99 и C ++ 98 вам не разрешалось использовать тот, который ссылался на символ в базовом наборе символов (который включает U + 002D).

C ++ 11 обновил это требование, поэтому, если вы находитесь внутри строкового или символьного литерала, вам разрешено использовать UCN, который ссылается на основные символы. В зависимости от используемой версии компилятора, я думаю, вы можете использовать Objective-C ++ 11, чтобы сделать ваш код легальным.

Тем не менее, поскольку этот символ является частью ASCII и базового набора символов, почему бы вам просто не написать его буквально?

@"-"
У некоторых персонажей могут быть такие проблемы. Но этот символ является ASCII и является частью основного набора символов. bames53
Вообще-то, я повторился там. Но причина, являющаяся частью основного набора символов, требует некоторого объяснения. Короче говоря, почти любая проблема, с которой вы будете писать символ из базового набора символов буквально в символьном или строковом литерале, вы также столкнетесь с UCN. Единственный способ, которым UCN могут работать, когда литерал- not - это если ваш компилятор ожидает кодировку входного файла не ascii. И в этом случае у вас будут большие проблемы. bames53
Для полной истории вам нужно прочитать о том, как ваш компилятор преобразует физические символы исходного файла в исходный набор символов, и как символьные и строковые литералы преобразуются в различные кодировки выполнения. Вам также необходимо знать, как важна кодировка выполнения, когда пользователь запускает программу, и как окружение пользователя влияет на то, как работает программа и как отображается ее вывод. bames53
Спасибо за ответ и справку. Возможно, я ошибаюсь, но я думал, что есть некоторый риск, пытаясь написать символ буквально, если конечный пользователь выбрал язык или клавиатуру, которая не является римской (например, китайский, иврит и т. Д.). Вот почему я пытался пойти на Unicode route. DenVog
Спасибо за разъяснения. Помечено решено и проголосовало. DenVog

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