C++ и UTF8
От: Аноним  
Дата: 26.10.11 19:47
Оценка:
Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ?
(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )
Re: C++ и UTF8
От: dilmah США  
Дата: 26.10.11 19:57
Оценка: 1 (1) +4 -2
А>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )

strcat, strcpy работают без изменений

В дополнение к strcmp есть strcoll, но strcmp тоже работает
Re[2]: C++ и UTF8
От: whitewin  
Дата: 26.10.11 20:33
Оценка: +1 -5
Здравствуйте, dilmah, Вы писали:


А>>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )


D>strcat, strcpy работают без изменений


D>В дополнение к strcmp есть strcoll, но strcmp тоже работает


strcmp(), strcat(), strcpy() будут работать некорректно

как вариант можно воспользоваться библиотекой ICU http://site.icu-project.org/
Re[3]: C++ и UTF8
От: dilmah США  
Дата: 26.10.11 20:40
Оценка: +2
D>>strcat, strcpy работают без изменений
D>>В дополнение к strcmp есть strcoll, но strcmp тоже работает
W>strcmp(), strcat(), strcpy() будут работать некорректно

с чего вдруг?
Re[3]: C++ и UTF8
От: dilmah США  
Дата: 26.10.11 20:47
Оценка: -1 :)
W>strcmp(), strcat(), strcpy() будут работать некорректно

с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет
Re: C++ и UTF8
От: nen777w  
Дата: 26.10.11 20:49
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ?

А>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )

также как и с С-строками т.е. char*, абсолютно ничего не меняется, разве что способ кодирования не ASCII символов.

На эту тему когда очень доходчиво расписал Кодт
Автор: Кодт
Дата: 03.10.03
.
Re[4]: C++ и UTF8
От: whitewin  
Дата: 26.10.11 20:57
Оценка: +1
Здравствуйте, dilmah, Вы писали:


D>>>strcat, strcpy работают без изменений

D>>>В дополнение к strcmp есть strcoll, но strcmp тоже работает
W>>strcmp(), strcat(), strcpy() будут работать некорректно

D>с чего вдруг?


strcat(), strcpy() будут работать, а вот в strcmp() побайтовое сравнение может дать неверный результат
Re[4]: C++ и UTF8
От: Алексей  
Дата: 27.10.11 01:52
Оценка: -4
Здравствуйте, dilmah, Вы писали:


W>>strcmp(), strcat(), strcpy() будут работать некорректно


D>с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет


Вот и нафиг нужен такой язык?
Re[5]: C++ и UTF8
От: AleksandrN Россия  
Дата: 27.10.11 06:07
Оценка: -1
Здравствуйте, Алексей, Вы писали:

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



W>>>strcmp(), strcat(), strcpy() будут работать некорректно


D>>с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет


А>Вот и нафиг нужен такой язык?


Язык Си был придуман на 20 лет раньше, чем многобайтные кодировки, а среди разработчиков языка не было пророков, которые могли предсказать такие кодировки. И проблемы с strcmp и UTF-8 могут проявится только если нужна сортировать строки по алфавиту. Но если нужно сортировать строки на Русском языке, то strcmp() в любом случае не подходит, т.к. во всех кодировках кириллицы буква Ё расположена не по алфавиту, а в КОИ-8, все буквы расположены не по алфавиту.

В случае, когда нужно просто сравнить UTF-8 строки на равенство, strcmp() можно использовать.
Re[4]: C++ и UTF8
От: gegMOPO4  
Дата: 27.10.11 07:04
Оценка:
Здравствуйте, dilmah, Вы писали:
W>>strcmp(), strcat(), strcpy() будут работать некорректно
D>с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет

Нет никаких эквивалентных кодов в UTF-8.
Re[5]: C++ и UTF8
От: uzhas Ниоткуда  
Дата: 27.10.11 07:14
Оценка: +1
Здравствуйте, 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://msdn.microsoft.com/en-us/library/windows/desktop/dd374081%28v=vs.85%29.aspx
Re[5]: C++ и UTF8
От: dilmah США  
Дата: 27.10.11 07:17
Оценка:
MOP>Нет никаких эквивалентных кодов в UTF-8.

почему? В обычном то юникоде есть? http://en.wikipedia.org/wiki/Unicode_equivalence
А обычный юникод преобразуется в multibyte UTF-8 по четко описанным правилам. Там же нет требования нормализации какой-то или есть?
Re[6]: C++ и UTF8
От: gegMOPO4  
Дата: 27.10.11 07:32
Оценка:
Здравствуйте, dilmah, Вы писали:
MOP>>Нет никаких эквивалентных кодов в UTF-8.
D>почему? В обычном то юникоде есть? http://en.wikipedia.org/wiki/Unicode_equivalence
D>А обычный юникод преобразуется в multibyte UTF-8 по четко описанным правилам. Там же нет требования нормализации какой-то или есть?

А-а-а, в этом смысле… Ну тогда нужно другой смысл вкладывать в «равенство строк».
Re[5]: C++ и UTF8
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.10.11 09:13
Оценка: 2 (1)
Здравствуйте, Алексей, Вы писали:

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



W>>>strcmp(), strcat(), strcpy() будут работать некорректно


D>>с strcmp действительно будут не очень хорошие вещи если нужно чтобы эквивалентные коды считались равными, но работать то все равно будет


А>Вот и нафиг нужен такой язык?


Кодировка это вещь, которая параллельна языку. Например, в C# будет ли "weiß" = "weiss"???
Re: C++ и UTF8
От: sidorov18 США  
Дата: 27.10.11 09:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ?

А>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )

А что именно хочется делать со строками?
Может сразу в UTF-16 переводить?
Re: C++ и UTF8
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.10.11 09:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ?

А>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )

Можно использовать стандартные. Одна из проблем в том, что в функции strcmp можно придумать тысячи различных вариантов сравнения строк, не факт, что вариант по умолчанию тебя устроит.
Re[2]: C++ и UTF8
От: gegMOPO4  
Дата: 27.10.11 10:00
Оценка: +1 -3
Здравствуйте, sidorov18, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ?
А>>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )
S>А что именно хочется делать со строками?
S>Может сразу в UTF-16 переводить?

UTF-16 во всех смыслах хуже UTF-8.
Re[3]: C++ и UTF8
От: sidorov18 США  
Дата: 27.10.11 10:23
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

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

S>>Здравствуйте, Аноним, Вы писали:
А>>>Подскажите пожалуйста, как в С++ работать со строками в кодировке UTF-8 ?
А>>>(требуется стандартный набор строковых функций — strcmp(), strcat(), strcpy()... )
S>>А что именно хочется делать со строками?
S>>Может сразу в UTF-16 переводить?

MOP>UTF-16 во всех смыслах хуже UTF-8.



Скажите хоть пару.
Re[4]: C++ и UTF8
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.10.11 10:29
Оценка:
Здравствуйте, sidorov18, Вы писали:

MOP>>UTF-16 во всех смыслах хуже UTF-8.


S>

S>Скажите хоть пару.

Больше места, все равно символы как двумя байтами, так и четырьмя, надо дополнительно константы из кода переводить в UTF-16 тоже
Re[5]: C++ и UTF8
От: sidorov18 США  
Дата: 27.10.11 11:22
Оценка: 1 (1)
Здравствуйте, 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 переводить.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.