Всегда ли ASCII-строка нормализирована?
От: Went  
Дата: 23.08.22 13:53
Оценка:
Здравствуйте.
Вопрос, наверное, не совсем по C++, но возник в связи с ним. У меня есть код, работающий со строками, и неслабо проседает на том, что нормализирует каждую строку (средствами библиотеки ICU). Строки преимущественно ASCII (символы от 32 до 127). Могу ли я считать, что все ASCII-строки будут априори нормализированы по всем четырем формам? Вроде бы ни один ASCII-символ не распадается на составные.
Re: Всегда ли ASCII-строка нормализирована?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 23.08.22 18:35
Оценка: 2 (1)
Здравствуйте, Went, Вы писали:

W>Здравствуйте.

W>Вопрос, наверное, не совсем по C++, но возник в связи с ним. У меня есть код, работающий со строками, и неслабо проседает на том, что нормализирует каждую строку (средствами библиотеки ICU). Строки преимущественно ASCII (символы от 32 до 127). Могу ли я считать, что все ASCII-строки будут априори нормализированы по всем четырем формам? Вроде бы ни один ASCII-символ не распадается на составные.

Вот как бы не оказалось, что в турецкой локали U+0069 = U+0131 + U+0307...
The God is real, unless declared integer.
Re: Всегда ли ASCII-строка нормализирована?
От: Went  
Дата: 24.08.22 06:46
Оценка:
Вот такое вычитал на unicode.org

Unicode normalization comes in 4 flavors: C, D, KC, KD. It is C that is relevant for W3C normalization. W3C normalization also treats character references (&#nnnn as equivalent to characters. For example, the text string "a&#xnnnn;" (where nnnn = "0301") is Unicode-normalized since it consists only of ASCII characters, but it is not W3C-normalized, since it contains a representation of a combining acute accent with "a", and in normalization form C, that should have been normalized to U+00E1.

Судя по выделенному, ASCII-строки, таки, всегда нормальные.
Re[2]: Всегда ли ASCII-строка нормализирована?
От: Went  
Дата: 24.08.22 06:54
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, Went, Вы писали:


W>>Здравствуйте.

W>>Вопрос, наверное, не совсем по C++, но возник в связи с ним. У меня есть код, работающий со строками, и неслабо проседает на том, что нормализирует каждую строку (средствами библиотеки ICU). Строки преимущественно ASCII (символы от 32 до 127). Могу ли я считать, что все ASCII-строки будут априори нормализированы по всем четырем формам? Вроде бы ни один ASCII-символ не распадается на составные.

N>Вот как бы не оказалось, что в турецкой локали U+0069 = U+0131 + U+0307...

Покопал глубже (юникод не мой профиль). Возникли вопросы:
Или я вообще не туда копаю?
Re: Всегда ли ASCII-строка нормализирована?
От: Zhendos  
Дата: 25.08.22 17:09
Оценка:
Здравствуйте, Went, Вы писали:

W>Вопрос, наверное, не совсем по C++, но возник в связи с ним. У меня есть код, работающий со строками, и неслабо проседает на том, что нормализирует каждую строку (средствами библиотеки ICU). Строки преимущественно ASCII (символы от 32 до 127). Могу ли я считать, что все ASCII-строки будут априори нормализированы по всем четырем формам? Вроде бы ни один ASCII-символ не распадается на составные.


А в чем сложность написать программу с использование ICU и проверить нормализацию символов от 32 до 127,
если возникли сомнения?
Re[2]: Всегда ли ASCII-строка нормализирована?
От: Went  
Дата: 26.08.22 06:03
Оценка:
Здравствуйте, Zhendos, Вы писали:
Z>А в чем сложность написать программу с использование ICU и проверить нормализацию символов от 32 до 127,
Z>если возникли сомнения?
Да это давно сделано. Но раз такая оптимизация не была сделана до меня, у меня возникают сомнения, может есть причина. Может, есть какие-то особые условия или длинные комбинации, которые нормализируются.
Re[2]: Всегда ли ASCII-строка нормализирована?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.08.22 11:57
Оценка: 2 (1)
Здравствуйте, Went, Вы писали:

W>Вот такое вычитал на unicode.org

W>

W>Unicode normalization comes in 4 flavors: C, D, KC, KD. It is C that is relevant for W3C normalization. W3C normalization also treats character references (&#nnnn as equivalent to characters. For example, the text string "a&#xnnnn;" (where nnnn = "0301") is Unicode-normalized since it consists only of ASCII characters, but it is not W3C-normalized, since it contains a representation of a combining acute accent with "a", and in normalization form C, that should have been normalized to U+00E1.

W>Судя по выделенному, ASCII-строки, таки, всегда нормальные.

Что-то тут не то. Наличие U+0301 противоречит "consists only of ASCII characters".
Весь в целом абзац, как я понял, означает "is Unicode-normalized" в смысле "соответствует какой-то из нормальных форм Unicode" (какой именно — уже неважно). Это не запрещает того, что оно может меняться в зависимости от формы.

А в общем мне стало настолько интересно, что я спросил на SO: https://stackoverflow.com/q/73500679
посмотрим...
The God is real, unless declared integer.
Re[3]: Всегда ли ASCII-строка нормализирована?
От: Went  
Дата: 29.08.22 08:38
Оценка:
Здравствуйте, netch80, Вы писали:

N>Что-то тут не то. Наличие U+0301 противоречит "consists only of ASCII characters".

N>Весь в целом абзац, как я понял, означает "is Unicode-normalized" в смысле "соответствует какой-то из нормальных форм Unicode" (какой именно — уже неважно). Это не запрещает того, что оно может меняться в зависимости от формы.

Нет, там же не "a\u0301", а именно "a&#xnnnn;", и строка содержит только ASCII. То есть форма "&#....." — это запись, замещающаяся юникодным символом только в W3C-нормализации (например, в XML такое часто используется), а не в канонической Unicode-нормализации, о которой я веду речь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.