ГОСТ Р ИСО/МЭК 40220-2015. Национальный стандарт Российской Федерации. Информационные технологии. W3C SOAP. Версия 1.2. Часть 2. Дополнения (вторая редакция)
Приложение B
(справочное)
ОТОБРАЖЕНИЕ ИМЕН, ОПРЕДЕЛЕННЫХ ПРИЛОЖЕНИЯМИ, В ИМЕНА XML
Это приложение детализирует алгоритм отображения определенных приложениями имен, таких как имена переменных или полей в языках программирования, в символы Unicode для того, чтобы имена были корректными именами элементов и атрибутов XML в соответствии со спецификацией пространств имен в XML [Namespaces in XML].
Шестнадцатеричные цифры
[5]hexDigit ::= [0-9A-F]
B.1. Правила для отображения имен, определенных приложениями, в имена XML
1. XML имя состоит из двух частей: Prefix и LocalPart. Пусть Prefix определяется в соответствии с правилами и ограничениями, определенными в [Namespaces in XML].
2. Пусть T - это имя в приложении, представленное в виде последовательности символов, закодированных в определенной кодировке.
3. Пусть M - определенная реализацией функция для перекодирования символов, используемых в определенных приложениями именах, в эквивалентные строки символов Unicode.
Примечания
1. В идеальном варианте, если это перекодирование из не-Unicode кодировки, то оно должно быть и обратимым, и нормализующим по форме C Unicode (т.е. комбинирование последовательности представлены в предписанном каноническом порядке). Следует заметить, что некоторые перекодирования не могут быть совершенно обратимыми, и в некоторых случаях нормализация по форме C (NFC) может изменить исходную последовательность (см. [CharMod]). Для того, чтобы обеспечить соответствие имен после перекодировки, последовательности Unicode должны быть нормализованы с формы нормализации C Unicode.
2. Перекодирование преобразует в скалярные значения Unicode ("кодовые позиции"), а не в какую-либо определенную схему кодирования символов Unicode, такую как UTF-8 или UTF-16.
3. Корректные последовательности суррогатных пар должны быть преобразованы в соответствующие им скалярные значения ("кодовые позиции") (т.е. последовательность U+D800 U+DC00 должна быть перекодирована в символ U+10000). Если перекодирование определено для кодировки Unicode, то несоответствующие (не являющиеся самыми короткими формами) последовательности UTF-8 и UTF-16 должны быть преобразованы в соответствующие им скалярные значения.
4. Количество символов в T не обязательно совпадает с количеством символов в M, потому что перекодирование может быть и таким, что один символ кодируется несколькими, и наоборот, несколько символов кодируются одним. Детали перекодирования могут определяться реализацией. В редких случаях нет никакого эквивалентного представления Unicode для T. Такие случаи здесь не описаны.
1. Пусть C - последовательность скалярных значений Unicode (символов), составляющих M(T).
2. Пусть N - число символов в C. Пусть C1, C2 ... CN - символы C, представленные в логическом порядке от наиболее значащего к наименее значащему.
3. Для каждого i между 1 (единицей) и N, пусть Xi - строка из символов Unicode, определенная по следующим правилам.
Варианты:
1) Если Ci не определен (т.е. некоторый символ или последовательность символов из символьной последовательности приложения T не содержат отображения в Unicode), то Xi определяется реализацией.
2) Если i <= N-1 и Ci = "_" (U+005F, НИЖНЕЕ ПОДЧЕРКИВАНИЕ), и Ci+1 = "x" (U+0078, ЛАТИНСКАЯ СТРОЧНАЯ БУКВА X), то можно полагать, что Xi, станет равным "_x005F_".
3) Если i = 1, N >= 3 и C1 = "x" (U+0078, ЛАТИНСКАЯ СТРОЧНАЯ БУКВА X) или "X" (U+0058, ЛАТИНСКАЯ ПРОПИСНАЯ БУКВА X), и C2 = "m" (U+006D, ЛАТИНСКАЯ СТРОЧНАЯ БУКВА M) или "M" (U+004D, ЛАТИНСКАЯ ПРОПИСНАЯ БУКВА M), и C3 = "l" (U+006C, ЛАТИНСКАЯ СТРОЧНАЯ БУКВА L) или "L" (U+004C, ЛАТИНСКАЯ ПРОПИСНАЯ БУКВА L) (другими словами, в строке из трех или более символов, начинающейся с "xml", каждая буква может быть строчной или прописной). Если C1 - это "x" (U+0078, ЛАТИНСКАЯ СТРОЧНАЯ БУКВА X), то можно полагать, что X1 станет равным "_x0078_". В противном случае, если C1 - это "X" (U+0058, ЛАТИНСКАЯ ПРОПИСНАЯ БУКВА X), то можно полагать, что X1 станет равным "_x0058_".
4) Если Ci не является допустимым символом строк типа NCName (см. [Namespaces in XML]) или, если i = 1 (один) и C1 не является допустимым первым символом строки типа NCName тогда:
Пусть U1, U2, ..., U6 - шесть шестнадцатеричных цифр (см. грамматическое правило [5] выше) таких, что скалярное значение Unicode Ci есть "U+" U1 U2 ... U6.
Варианты:
Если U1 = 0, U2 = 0, U3 = 0, и U4 = 0, тогда можно положим Xi = "_x" U5 U6 "_".
Этот случай подразумевает, что Ci - символ в базовой многоязыковой плоскости (Basic Multilingual Plane, BMP, Плоскость 0) Unicode и он может быть полностью представлен одной "кодовой позицией" UTF-16 - последовательностью U+U5U6.
В противном случае положим Xi, равным "_x" U1 U2 U3 U4 U5 U6 "_".
В противном случае положим Xi, равным Mi, т.е. любой символ из X, который является разрешенным символом для строки типа NCName, просто копируется.
1. Положим LocalPart, равной конкатенации строк X1, X2, ..., XN в порядке от наиболее значимой к наименее значимой.
2. Положим XML имя, равным QName, согласно спецификации [Namespaces in XML].
B.2. Примеры
Hello world | -> Hello_x0020_world | |||
Hello_xorld | -> Hello_x005F_xorld | |||
Helloworld_ | -> Helloworld_ | |||
| ||||
x | -> x | |||
xml | -> _x0078_ml | |||
-xml | -> _x002D_xml | |||
x-ml | -> x-ml | |||
| ||||
-> | ||||
-> | ||||
| ||||
Hello world | -> Hello_x0020_world | |||
Hello_xorld | -> Hello_x005F_xorld | |||
Helloworld_ | -> Helloworld_ | |||
| ||||
x | -> x | |||
xml | -> _x0078_ml | |||
-xml | -> _x002D_xml | |||
x-ml | -> x-ml | |||
| ||||
-> | ||||
-> | ||||
| ||||
17 09 | 17 05 | 17 0E | 17 08 | -> _x1709__x1705__x170E__x1708_ |
| ||||
13 D9 | 13 DA | 13 A5 | -> _x13D9__x13DA__x13A5_ |
