Информация об изменениях

Сообщение Re: char или wchar_t? от 10.08.2022 15:58

Изменено 10.08.2022 15:58 Videoman

Re: char или wchar_t?
Здравствуйте, Barbar1an, Вы писали:

B>что вы обычно используете для текста?

std::string

B>я както автоматом перешел везде на wchar_t, но заметил по постам в разных стековерфловах отвечают используя char практически всегда

Правильно делают.

B>потом подумал что в теории можно и char обойтись в режиме мультибайта, но будут проблемы с производитедльностью, если нужны какието манипуляции со строками

У нас все манипуляции со строками, включая парсеры и строковый-формат не отличаются от работы с ANSI строками, т.к. детектировать в 99% нужно только подмножество ASCII < 0x80. Если ты нашел в utf-8 строке 'a'- то это именно она, если ',' — то это запятая. Единственно что нужно помнить, всегда соблюдать порядок код юнитов (просто работай со строкой как с контейнером байт) и проблем не будет. Честно мне вообще не понятно в чем проблема работать с UTF-8. Если символ меньше 0x80, то работаешь с ним как с ASCII, если больше, то пропускаешь сохраняя порядок.

B>может быть оптимальнее юзать char для разных идентификаторов т.е. там где может быть только латиница, а для контетнта — мультибайт?

Сейчас активно портирую код под Linux — проблем нет. std::string замечательно передаются и русские символы и китайские и даже вперемешку.

B>но еще так не пробовал , и пока не знаю , может быть много расходов на конвертацию туда сюда

Конвертация происходит только вокруг вызова API заточенного на Unicode кодировку отличную от UTF-8. В Linux и так всё UTF-8, в Windows собирается с флагом UNICODE и конвертируется туда-сюда. По сравнению с накладными расходами на сами вызовы, разница не заметна.

B>а у вас как?

B>и насколько вообще достаточно wchar_t для локализаций? есть ли там всё на все случаи?
wchar_t не нужен, т.к. с точки зрения не понятно какая кодировка в такой строке лежит UTF-16 или UTF-32. Для работы с текстом посимвольно всё равно не подходит ни та ни та. Кодировка — это кодировка, она для хранения и потоковой передачи.

P.S. На правах рекламы. В процессе переезда под Linux у меня отпочковываются маленькие полезные библиотеки. Если что, вот: Simple UTF library for C++, может пригодится.
Re: char или wchar_t?
Здравствуйте, Barbar1an, Вы писали:

B>что вы обычно используете для текста?

std::string

B>я както автоматом перешел везде на wchar_t, но заметил по постам в разных стековерфловах отвечают используя char практически всегда

Правильно делают.

B>потом подумал что в теории можно и char обойтись в режиме мультибайта, но будут проблемы с производитедльностью, если нужны какието манипуляции со строками

У нас все манипуляции со строками, включая парсеры и строковый-формат не отличаются от работы с ANSI строками, т.к. детектировать в 99% нужно только подмножество ASCII < 0x80. Если ты нашел в utf-8 строке 'a'- то это именно она, если ',' — то это запятая. Единственно что нужно помнить, всегда соблюдать порядок код юнитов (просто работай со строкой как с контейнером байт) и проблем не будет. Честно, мне вообще не понятно в чем проблема работать с UTF-8. Если символ меньше 0x80, то работаешь с ним как с ASCII, если больше, то пропускаешь сохраняя порядок.

B>может быть оптимальнее юзать char для разных идентификаторов т.е. там где может быть только латиница, а для контетнта — мультибайт?

Сейчас активно портирую код под Linux — проблем нет. std::string замечательно передаются и русские символы и китайские и даже вперемешку.

B>но еще так не пробовал , и пока не знаю , может быть много расходов на конвертацию туда сюда

Конвертация происходит только вокруг вызова API заточенного на Unicode кодировку отличную от UTF-8. В Linux и так всё UTF-8, в Windows собирается с флагом UNICODE и конвертируется туда-сюда. По сравнению с накладными расходами на сами вызовы, разница не заметна.

B>а у вас как?

B>и насколько вообще достаточно wchar_t для локализаций? есть ли там всё на все случаи?
wchar_t не нужен, т.к. с точки зрения не понятно какая кодировка в такой строке лежит UTF-16 или UTF-32. Для работы с текстом посимвольно всё равно не подходит ни та ни та. Кодировка — это кодировка, она для хранения и потоковой передачи.

P.S. На правах рекламы. В процессе переезда под Linux у меня отпочковываются маленькие полезные библиотеки. Если что, вот: Simple UTF library for C++, может пригодится.