Может ли компилятор C ++ нормализовать идентификаторы Unicode? - PullRequest
0 голосов
/ 15 февраля 2019

В C ++ мы можем использовать самые разные символы Юникода в идентификаторах.Например, вы можете назвать переменную résumé.

. Эти акцентированные e s могут быть представлены различными способами: либо в виде предварительно составленного символа, либо в виде простого e с комбинирующим символом ударения.Многие приложения нормализуют такие строки, так что, казалось бы, идентичные строки действительно совпадают.

Глядя на стандарт C ++, я не вижу ничего, что требует компилятора для нормализации идентификаторов, поэтому переменная résuméможет отличаться от переменной résumé.(В моих тестах кажется, что MSVC и clang не нормализуют идентификаторы.)

Есть ли что-нибудь, что запрещает компилятору выбирать нормальную форму?Если нет, то на какой фазе перевода должна произойти нормализация?

[Для ясности: я говорю об идентификаторах, а не о строковых литералах.]

1 Ответ

0 голосов
/ 15 февраля 2019

Я полагаю, что компилятору разрешено выполнять эту нормализацию в фазе перевода 1:

Физические символы исходного файла отображаются, в соответствии с реализацией, в основной исходный набор символов (вводит новыйсимволы строки для индикаторов конца строки), если необходимо.Допустимый набор физических символов исходного файла определяется реализацией.Любой символ исходного файла, не входящий в базовый набор символов источника (5.3), заменяется на универсальное имя символа , которое обозначает этот символ.Реализация может использовать любую внутреннюю кодировку, если фактический расширенный символ встречается в исходном файле, и тот же расширенный символ, выраженный в исходном файле, как универсальное имя-символа (например, с использованием \uXXXX нотация), обрабатываются эквивалентно, за исключением случаев, когда эта замена отменяется (5.4) в необработанном строковом литерале.

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

...