Re[15]: Зачем?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 30.06.15 22:02
Оценка: 2 (1)
Здравствуйте, Went, Вы писали:

W>А, то есть некоторые символы могут быть записаны последовательностями 32-битных чаров, но для них, как правило, существует одночаровый эквивалент (кроме самых экзотических случаев)?


Можно и так сказать. ICU умеет приводить различные варианты записи таких символов к одному варианту когда это возможно.

http://userguide.icu-project.org/transforms/normalization
Ce n'est que pour vous dire ce que je vous dis.
Re: Кроссплатформенная работа со строками.
От: saf_e  
Дата: 02.07.15 07:35
Оценка: +2
Здравствуйте, WerWoolf, Вы писали:

WW>Здравствуйте. В связи с работой над одним проектом, возник вопрос в реализации класса строки.

WW>Реализация должна быть кроссплатформенной. Необходима поддержка всех доступных языков,
WW>т.е. ascii не подходит. Задача данного вопроса — узнать возможные варианты реализации
WW>класса, их плюсы и минусы.

WW>Варианты решения:


WW>1) Класс-обертка, который хранит строку как последовательность wchar_t символов.

WW>Здесь хотелось бы узнать плюсы или минусы данного варианта.

WW>2) Класс-обертка, который хранит строку как последовательность char символов, но в

WW>кодировке utf-8. Реализовать конвертеры в другие кодировки.
WW>Здесь хотелось бы узнать плюсы или минусы данного варианта.

WW>3) Другой вариант (который вы считаете лучшим).


WW>Я не прошу вас реализовывать данный класс, просто хотелось бы систематизировать данные

WW>по этому вопросу. Надеюсь на конструктивные ответы.
WW>Всем спасибо.

WW>P.S. Пожалуйста, не предлагайте использовать уже существующие классы из сторонних библиотек,

WW>такие как QString и т.п.

И std::string и std::wstring кросс-платформены и могут хранить любые символы до тех пор пока вы их интерпретируете как UTF-8 и UTF-16.
Обычно внутри программы (системы) имеет смысл принять один из вышеперечисленных и и спользовать его. А вовне отдавать конвертируя в нативное представление.

На Виндах нативное обычно UTF-16, в прочих больше прижилось UTF-8. Самый головняк, что стандартная библиотека MSVC поддерживает UTF-16, но UTF-8 не понимает считая его ANSI, а в остальных банально нету во многих местах поддржки UTF-16 (типа открыть файл/стрим). Это если конечно ниче не поменялось.

Поэтому пока у вас задача только хранить (и неизвестно надо ли еще чего-то) выберите кодировку и успокойтесь. Как надо будет что-то еще — ICU обычно хорошее решение, но часто можно обойтись и системным API.
Re[2]: Кроссплатформенная работа со строками.
От: uzhas Ниоткуда  
Дата: 02.07.15 08:18
Оценка:
Здравствуйте, saf_e, Вы писали:

_>И std::string и std::wstring кросс-платформены


все же std::wstring я бы не назвал кроссплатформенным из-за разного размера wchar_t у VS и gcc. в частности, на линуксе std::wstring часто интерпретируется, как UTF-32, а на винде, как UTF-16 (или как UCS-2)
по теме: многое зависит от сценариев использования. универсальных строк нет, у всех есть свои преимущества и недостатки.
лично я по дефолту использую basic_string, т.к. это стандартно (нет внешних зависимостей) и минимум накладных расходов; и пишу я обычно серверный софт (пусть даже и локализованный). использовать в юникодном гуе icu или другие жирные строки считаю нормальным ибо в гуе обычно перформанс не так важен, а корректность работы с разными языками важнее.
Re[3]: Кроссплатформенная работа со строками.
От: WerWoolf  
Дата: 02.07.15 08:36
Оценка:
Тут кто-то выше по теме обмолвился, что code point и символ не имеют однозначного соответствия.
Может кто-нибудь пояснит, почему так?
Re[3]: Кроссплатформенная работа со строками.
От: saf_e  
Дата: 02.07.15 08:39
Оценка:
Здравствуйте, uzhas, Вы писали:

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


_>>И std::string и std::wstring кросс-платформены


U>все же std::wstring я бы не назвал кроссплатформенным из-за разного размера wchar_t у VS и gcc. в частности, на линуксе std::wstring часто интерпретируется, как UTF-32, а на винде, как UTF-16 (или как UCS-2)

U>по теме: многое зависит от сценариев использования. универсальных строк нет, у всех есть свои преимущества и недостатки.
U>лично я по дефолту использую basic_string, т.к. это стандартно (нет внешних зависимостей) и минимум накладных расходов; и пишу я обычно серверный софт (пусть даже и локализованный). использовать в юникодном гуе icu или другие жирные строки считаю нормальным ибо в гуе обычно перформанс не так важен, а корректность работы с разными языками важнее.

на счет std::wstring согласен, этот нюанс нужно учесть при сериализации, как только они в памяти дальше разницы нет.
Re[4]: Кроссплатформенная работа со строками.
От: WerWoolf  
Дата: 06.07.15 19:53
Оценка:
Решил не создавать еще одну тему для этого вопроса.

#include <iostream>

int main()
{
    std::cout << u8"это строка6" << std::endl;
    return 0;
}


Устанавливаю в консоли кодовую страницу с помощью следующей команды:
chcp 65001

Выполняю программу, и получаю следующий вывод:
��то строка6


Почему первый символ отобразился неправильно?
Re[5]: Кроссплатформенная работа со строками.
От: VTT http://vtt.to
Дата: 06.07.15 21:16
Оценка: +1
а там случаем BOM не добавляется в начало строки?
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[6]: Кроссплатформенная работа со строками.
От: WerWoolf  
Дата: 07.07.15 07:40
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>а там случаем BOM не добавляется в начало строки?


Ну, судя по выводу, при использовании литерала u8, BOM в начало не добавляется.
Это кодировка 65001 думает, что в начале идет BOM, пытается прочитать его,
а остальное выводит нормально. Тогда хотелось бы найти кодировку UTF-8 без BOM.
Re[9]: Зачем?
От: MasterZiv СССР  
Дата: 07.07.15 08:00
Оценка:
Здравствуйте, WerWoolf, Вы писали:

WW>А чем плох вариант всюду использовать wchar_t?

WW>Стандарт, насколько мне известно, гарантирует, что один wchar_t должен соответствовать одному символу.

Нет, не гарантирует.
Это гарантируется только для языков кроме китайского. Подробнее смотри в стандарте Unicode.
Re: Кроссплатформенная работа со строками.
От: ZiloT  
Дата: 21.07.15 12:16
Оценка: 8 (1)
Здравствуйте, WerWoolf, Вы писали:

WW>Здравствуйте. В связи с работой над одним проектом, возник вопрос в реализации класса строки.

WW>Реализация должна быть кроссплатформенной. Необходима поддержка всех доступных языков,
WW>т.е. ascii не подходит. Задача данного вопроса — узнать возможные варианты реализации
WW>класса, их плюсы и минусы.

WW>Варианты решения:


WW>1) Класс-обертка, который хранит строку как последовательность wchar_t символов.

WW>Здесь хотелось бы узнать плюсы или минусы данного варианта.

WW>2) Класс-обертка, который хранит строку как последовательность char символов, но в

WW>кодировке utf-8. Реализовать конвертеры в другие кодировки.
WW>Здесь хотелось бы узнать плюсы или минусы данного варианта.

WW>3) Другой вариант (который вы считаете лучшим).


WW>Я не прошу вас реализовывать данный класс, просто хотелось бы систематизировать данные

WW>по этому вопросу. Надеюсь на конструктивные ответы.
WW>Всем спасибо.

WW>P.S. Пожалуйста, не предлагайте использовать уже существующие классы из сторонних библиотек,

WW>такие как QString и т.п.

Рекомендую к прочтению utf8everywhere
Re: Кроссплатформенная работа со строками.
От: drVanо Россия https://vmpsoft.com
Дата: 26.07.15 18:37
Оценка:
Здравствуйте, WerWoolf, Вы писали:

WW>2) Класс-обертка, который хранит строку как последовательность char символов, но в

WW>кодировке utf-8. Реализовать конвертеры в другие кодировки.
WW>Здесь хотелось бы узнать плюсы или минусы данного варианта.

Мы сделали все на std::string + UTF8.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.