Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ?
(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )
А>>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )
D>strcat, strcpy работают без изменений
D>В дополнение к strcmp есть strcoll, но strcmp тоже работает
strcmp(), strcat(), strcpy() будут работать некорректно
D>>strcat, strcpy работают без изменений D>>В дополнение к strcmp есть strcoll, но strcmp тоже работает W>strcmp(), strcat(), strcpy() будут работать некорректно
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ? А>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )
также как и с С-строками т.е. char*, абсолютно ничего не меняется, разве что способ кодирования не ASCII символов.
D>>>strcat, strcpy работают без изменений D>>>В дополнение к strcmp есть strcoll, но strcmp тоже работает W>>strcmp(), strcat(), strcpy() будут работать некорректно
D>с чего вдруг?
strcat(), strcpy() будут работать, а вот в strcmp() побайтовое сравнение может дать неверный результат
W>>strcmp(), strcat(), strcpy() будут работать некорректно
D>с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет
Здравствуйте, Алексей, Вы писали:
А>Здравствуйте, dilmah, Вы писали:
W>>>strcmp(), strcat(), strcpy() будут работать некорректно
D>>с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет
А>Вот и нафиг нужен такой язык?
Язык Си был придуман на 20 лет раньше, чем многобайтные кодировки, а среди разработчиков языка не было пророков, которые могли предсказать такие кодировки. И проблемы с strcmp и UTF-8 могут проявится только если нужна сортировать строки по алфавиту. Но если нужно сортировать строки на Русском языке, то strcmp() в любом случае не подходит, т.к. во всех кодировках кириллицы буква Ё расположена не по алфавиту, а в КОИ-8, все буквы расположены не по алфавиту.
В случае, когда нужно просто сравнить UTF-8 строки на равенство, strcmp() можно использовать.
Здравствуйте, dilmah, Вы писали: W>>strcmp(), strcat(), strcpy() будут работать некорректно D>с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет
Здравствуйте, gegMOPO4, Вы писали:
MOP>Нет никаких эквивалентных кодов в UTF-8.
возможно, подразумевалось, что один и тот же символ может представляться разными кодами
The Unicode character set includes numerous combining characters, such as U+0308 ("¨"), a combining dieresis or umlaut. Unicode can often represent the same glyph in either a ''composed'' or a ''decomposed'' form: for example, the composed form of "Ä" is the single Unicode code point "Ä" (U+00C4), while its decomposed form is "A" + "¨" (U+0041 U+0308). Unicode does not define a composed form for every glyph. For example, the Vietnamese lowercase "o" with circumflex and tilde ("ỗ") is represented by U+006f U+0302 U+0303 (o + Circumflex + Tilde). For further discussion of combining characters and related issues, see Using Unicode Normalization to Represent Strings.
почему? В обычном то юникоде есть? http://en.wikipedia.org/wiki/Unicode_equivalence
А обычный юникод преобразуется в multibyte UTF-8 по четко описанным правилам. Там же нет требования нормализации какой-то или есть?
Здравствуйте, dilmah, Вы писали: MOP>>Нет никаких эквивалентных кодов в UTF-8. D>почему? В обычном то юникоде есть? http://en.wikipedia.org/wiki/Unicode_equivalence D>А обычный юникод преобразуется в multibyte UTF-8 по четко описанным правилам. Там же нет требования нормализации какой-то или есть?
А-а-а, в этом смысле… Ну тогда нужно другой смысл вкладывать в «равенство строк».
Здравствуйте, Алексей, Вы писали:
А>Здравствуйте, dilmah, Вы писали:
W>>>strcmp(), strcat(), strcpy() будут работать некорректно
D>>с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет
А>Вот и нафиг нужен такой язык?
Кодировка это вещь, которая параллельна языку. Например, в C# будет ли "weiß" = "weiss"???
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ? А>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )
А что именно хочется делать со строками?
Может сразу в UTF-16 переводить?
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ? А>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )
Можно использовать стандартные. Одна из проблем в том, что в функции strcmp можно придумать тысячи различных вариантов сравнения строк, не факт, что вариант по умолчанию тебя устроит.
Здравствуйте, sidorov18, Вы писали: S>Здравствуйте, Аноним, Вы писали: А>>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ? А>>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... ) S>А что именно хочется делать со строками? S>Может сразу в UTF-16 переводить?
Здравствуйте, gegMOPO4, Вы писали:
MOP>Здравствуйте, sidorov18, Вы писали: S>>Здравствуйте, Аноним, Вы писали: А>>>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ? А>>>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... ) S>>А что именно хочется делать со строками? S>>Может сразу в UTF-16 переводить?
MOP>UTF-16 во всех смыслах хуже UTF-8.
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, sidorov18, Вы писали:
MOP>>>UTF-16 во всех смыслах хуже UTF-8.
S>> S>>Скажите хоть пару.
M>Больше места
Врядли вам часто нужно хранить магабайты текста в памяти. Был хоть один такой случай?
Зато все винапи работает с UTF-16. неоднократно встречал упоминание, что изначальные функции для UTF-16. т.е. каждый вызов ANSI версии будет конвертировать вашу строку в UTF-16.
+ если понадобится узнать количество символов в строке или доступ по индексу — моментально вылезут удобства UTF-16.
т.е. удобства UTF-8 появятся только тогда, когда в памяти нужна будет тонна текста. И это еще зависит от того, что с текстом делать потом будуте..
M>все равно символы как двумя байтами, так и четырьмя, надо дополнительно константы из кода переводить в UTF-16 тоже
что значит переводить?
"Василий"//L"Василий"
вот так переводить?
решается макросом _T()
Если, конечно, строка не нужна в двух вариантах, как, например, при отправке HTTP POST запроса, где строку все равно нужно будет в UTF-8 переводить.