Здравствуйте.
Вопрос, наверное, не совсем по C++, но возник в связи с ним. У меня есть код, работающий со строками, и неслабо проседает на том, что нормализирует каждую строку (средствами библиотеки ICU). Строки преимущественно ASCII (символы от 32 до 127). Могу ли я считать, что все ASCII-строки будут априори нормализированы по всем четырем формам? Вроде бы ни один ASCII-символ не распадается на составные.
Здравствуйте, Went, Вы писали:
W>Здравствуйте. W>Вопрос, наверное, не совсем по C++, но возник в связи с ним. У меня есть код, работающий со строками, и неслабо проседает на том, что нормализирует каждую строку (средствами библиотеки ICU). Строки преимущественно ASCII (символы от 32 до 127). Могу ли я считать, что все ASCII-строки будут априори нормализированы по всем четырем формам? Вроде бы ни один ASCII-символ не распадается на составные.
Вот как бы не оказалось, что в турецкой локали U+0069 = U+0131 + U+0307...
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-строки, таки, всегда нормальные.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, Went, Вы писали:
W>>Здравствуйте. W>>Вопрос, наверное, не совсем по C++, но возник в связи с ним. У меня есть код, работающий со строками, и неслабо проседает на том, что нормализирует каждую строку (средствами библиотеки ICU). Строки преимущественно ASCII (символы от 32 до 127). Могу ли я считать, что все ASCII-строки будут априори нормализированы по всем четырем формам? Вроде бы ни один ASCII-символ не распадается на составные.
N>Вот как бы не оказалось, что в турецкой локали U+0069 = U+0131 + U+0307...
Покопал глубже (юникод не мой профиль). Возникли вопросы:
Разве нормализация привязана к локали? Мы ведь ведём речь о юникоде.
Нигде не пишется, что малая 'i' декомозируется. Например, тут. При этом она может являться частью декомпозиции: ì(U+00EC) = i(U+0069) + ̀ (U+0300). А так как результат декомпозиции вроде как нормализирован (нельзя декомпозитить результат декомпозиции), это ещё одно доказательство того, что 'i' нормализирована по сути.
Здравствуйте, Went, Вы писали:
W>Вопрос, наверное, не совсем по C++, но возник в связи с ним. У меня есть код, работающий со строками, и неслабо проседает на том, что нормализирует каждую строку (средствами библиотеки ICU). Строки преимущественно ASCII (символы от 32 до 127). Могу ли я считать, что все ASCII-строки будут априори нормализированы по всем четырем формам? Вроде бы ни один ASCII-символ не распадается на составные.
А в чем сложность написать программу с использование ICU и проверить нормализацию символов от 32 до 127,
если возникли сомнения?
Здравствуйте, Zhendos, Вы писали: Z>А в чем сложность написать программу с использование ICU и проверить нормализацию символов от 32 до 127, Z>если возникли сомнения?
Да это давно сделано. Но раз такая оптимизация не была сделана до меня, у меня возникают сомнения, может есть причина. Может, есть какие-то особые условия или длинные комбинации, которые нормализируются.
Здравствуйте, 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" (какой именно — уже неважно). Это не запрещает того, что оно может меняться в зависимости от формы.
Здравствуйте, netch80, Вы писали:
N>Что-то тут не то. Наличие U+0301 противоречит "consists only of ASCII characters". N>Весь в целом абзац, как я понял, означает "is Unicode-normalized" в смысле "соответствует какой-то из нормальных форм Unicode" (какой именно — уже неважно). Это не запрещает того, что оно может меняться в зависимости от формы.
Нет, там же не "a\u0301", а именно "a&#xnnnn;", и строка содержит только ASCII. То есть форма "&#....." — это запись, замещающаяся юникодным символом только в W3C-нормализации (например, в XML такое часто используется), а не в канонической Unicode-нормализации, о которой я веду речь.