Ответ 1
Как уже упоминалось, приложение D ISO/IEC 9899: 2011 шестнадцатеричные значения символов, действительные для универсальных имен символов в C11. (Я не буду повторять это здесь.) Я искал ответ на вопрос "почему" этот список был выбран.
Стандарты набора символов
Во-первых, существуют два соответствующих стандарта, определяющих набор символов: ISO/IEC 10646 (определение UCS) и Unicode. Чтобы еще больше смутить (или упростить) вещи, они оба определяют одни и те же символы, поскольку ISO и Unicode поддерживают их synchronized. UCS - это, по сути, только символ, сопоставляющий значения с набором символов ( "репертуар" ), в то время как Unicode также дает дополнительные определения, такие как сравнение строк в алфавитном порядке сортировки (сопоставление), которые указывают "канонически эквивалентные" символы (normalization) и двунаправленный алгоритм для обработки символов на языках, написанных справа налево, и многое другое.
Универсальные имена символов в C
Универсальные имена символов (UCN) - это функция, недавно добавленная в C99 (ISO/IEC 9899: 1999). В "Обосновании международного стандарта --- Языки программирования --- C" (Rev.2, октябрь 1999 г.), целью было "включить использование любого" родного "символа в идентификаторах, строковых литералах и символьных константах, сохраняя при этом цель переносимости of C" (п. 5.2.1). В этом разделе мы продолжаем рассказывать о том, как кодировать эти символы в формах C (формы \U
и \U
в сравнении с многобайтовыми символами или родными кодировками) и политическими моделями того, как с ним бороться (стр .14, см. PDF страница 22).
Обоснование
Я надеялся, что тот же "обоснование" документа с 1999 года послужит причиной того, почему каждый расширенный диапазон символов был выбран как приемлемый для C99 UCN. В целом обоснование Приложения I:
Приложение я Универсальные имена символов для идентификаторов (нормативные)
Новая функция C9X.
Это не очень логично. Они даже не знали, в каком году будет опубликован стандарт C, поэтому он просто называется "C9X". Позднее обоснованный документ с 2003 года немного более просвещает:
Приложение D Универсальные имена символов для идентификаторов (нормативные)
Новая функция для C99.
Цель состоит в том, чтобы поддерживать ток с ISO/IEC TR 10176.
ISO/IEC TR 10176 - "Рекомендации для подготовка стандартов языка программирования". Это в основном путеводитель для людей, которые пишут стандарты языка программирования. В нем содержатся рекомендации по использованию наборов символов в языках программирования, а также "рекомендуемый расширенный репертуар для пользовательских идентификаторов" (Приложение A). Но эта цитата из документа обоснования 2003 года - это всего лишь "намерение сохранить текущее", а не обязательство строго соблюдать TR 10176.
Существует общедоступная таблица ISO/IEC TR 10176: 2003. Значения символов относятся к ISO 10646. Таблица классифицирует диапазоны символов из множества языков как "прописные" Lu
; "нижний регистр" Ll
; "число, десятичная цифра" Nd
, "пунктуация, коннектор" Pc
; и т.д. Должно быть понятно, что использовать такие классификации для языка программирования.
Важным напоминанием является то, что TR 10176 является Техническим отчетом, а не стандартом. Я нашел несколько ссылок на него на форумах и в документах, относящихся к другим языкам программирования, таким как язык Ada, COBOL и D. Большая часть обсуждений заключалась в том, насколько тесно эти языки должны соответствовать требованиям стандарта TR 10176 (не являясь стандартом) и жалоб, что TR 10176 отстает от обновлений ISO 10646.
Возможно, наиболее просвещательным является документ WG21/N3146: "Рекомендации для расширенных символов идентификатора для C и С++". Он начинается с комментария в 2010 году к органу стандартов, рекомендующему ограничения на исходные символы идентификаторов. В нем упоминаются похожие жалобы на C, ссылающиеся на TR 10176, и излагаются предложения о том, какие символы должны быть разрешены в качестве начальных символов идентификатора на основе ограничений от Идентификатор Unicode и синтаксис шаблонов и Общие XML-синтаксические конструкции. WG21/N3146 дает предлагаемую формулировку, которая позже появилась в стандарте C11 ISO/IEC 9899: 2011. В конце документа есть таблица, которая помогает пролить свет на выбранные диапазоны символов.
Разрешенные и недопустимые символы в C11
Ниже представлен скомпилированный список диапазонов для расширенных символов идентификатора. Диапазоны жирный шрифт - это те, что указаны в C11 (ISO/IEC 9899: 2011 Приложение D). Некоторые комментарии добавляются в выделенные курсивом диапазоны, не указанные в C11 (т.е. Не разрешенные). Они либо помечены как WG21/N3146, как это запрещено Unicode UAX # 31 или Общие XML-синтаксические конструкции или запрещены каким-либо другим комментарием.
00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00C0-00D6, 00D8-00F6, 00F8-00FF: (Различные символы, такие как женские и мужские º порядковые индикаторы, гласные с диакритические знаки, числовые символы, такие как надстрочные числа, дроби и т.д.)
(предыдущие пробелы): Все не разрешены UAX31 и/или XML. (Обычно знаки знаков препинания, такие как "", денежные символы ¥ £, математические операторы × ÷ и т.д.)
0100-167F: (латинский, греческий, кириллический, арабский, тайский, эфиопский и т.д. - многие другие)
1680: "Блок Ogham содержит script -специфическое пространство:"
1681-180D: (Ogham, Tagalog, Mongolian и т.д.)
180E: "Монгольский блок содержит script -специфическое пространство"
180F-1FFF: (Дополнительные языки... фонетика, расширенная латынь и греческая и т.д.)
2000: запускает блок "Общая пунктуация", но некоторые из них разрешены:
200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F: (выбор из блока "Общая пунктуация" )
2070-218F: "Суперскрипты и подписи, символы валют, сочетание диакритических знаков для символов, буквенных символов, числовых форм"
2190-245F: "Стрелки, математические операторы, различные технические, управляющие изображения, оптическое распознавание символов"
2460-24FF: "Enclosed Alphanumerics"
2500: запускает "Чертеж коробки, элементы блока, геометрические фигуры" и т.д.
2776-2793: (некоторые дингбаты и круговые дингбаты)
2794-2BFF: (другой набор дингбатов, математические символы, стрелки, шаблоны Брайля и т.д.)
2C00-2DFF, 2E80-2FFF: "Glagolitic, Latin Extended-C, Coptic, Georgian Supplement, Tifinagh, Ethiopic Extended, Cyrillic Extended-A" (также радикальное дополнение CJK)
3000: (начало "Символы и пунктуация CJK", разрешены некоторые варианты)
3004-3007, 3021-302F, 3031-303F: (разрешены "Символы и знаки препинания CJK" )
3040-D7FF: "Хирагана, Катакана", больше идеограмм CJK, радикалов и т.д.
D800-F8FF: (Здесь начинается High и Low Surrogate Areas (числовое пространство, необходимое для кодирования), и Частное использование)
F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD: выбор из "Идеограмм совместимости CJK", "Арабских презентационных форм" и т.д. 10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD, 60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD, B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD: WG21/N3146 дает обоснование для этих конечных диапазонов:
Дополнительная частная область использования простирается от F0000 до 10FFFF; оба [AltId] и [XML2008] запрещают символы в этом диапазоне.
Кроме того, [AltId] запрещает, как не-символы, последние два кодовые позиции каждой плоскости, т.е. каждая позиция формы P FFFE или P FFFF, для любого значения P.
"Диапазоны символов, которые не разрешены первоначально" из C11 Приложение D.2 0300-036F, 1DC0-1DFF, 20D0-20FF, FE20-FE2F.
С этим WG21/N3146, размещенные рядом с Приложение D стандарта стандарт C11, многое может быть выведено о том, как они выстраиваются в линию. Например, математические операторы и знаки препинания, по-видимому, не допускаются. Надеюсь, что это проливает свет на "почему" или "как" выбраны допустимые символы.
TL;DR; версия
- Авторитетным источником для символов юридического идентификатора является стандарт C11 ISO/IEC 9899: 2011 (См. Приложение D).
- Этот список основан на техническом отчете, ISO/IEC TR 10176, но с изменения.