Хранение текста Unicode в std:string

У меня есть код С# на стороне сервера, который сериализует (среди прочего) некоторые строки Unicode (используя кодировку UTF8).

На стороне клиента я хотел бы десериализовать все эти строки. Я смог их десериализовать и сохранить как wstrings.

Но потом я слышал, что строки Unicode можно хранить и в обычных string. Я также читал, что wstring не переносимы, и поэтому их следует избегать. Поэтому мне интересно, каковы преимущества/недостатки использования string по сравнению с wstring в моей ситуации.

Кроме того, я до сих пор не понимаю, как можно хранить строки Unicode внутри обычных переменных string. Это звучит странно, зная, что строка является вектором символов. Как можно сохранить произвольный символ внутри char (8-битный тип)? Будет ли string::length() возвращать количество символов или байтов? Как насчет string::size()? Что вернет оператор индексации?


person mk33    schedule 16.11.2015    source источник
comment
Почему бы не потратить некоторое время на гугление UTF-8 и не посмотреть, что вы узнали?   -  person Dúthomhas    schedule 16.11.2015
comment
Кодировка UTF-8 идентична ASCII для кодовых точек от 0 до 127; более высокие кодовые точки кодируются несколькими байтами. Таким образом, символы, отличные от ASCII, будут кодироваться как 2 или 3 байта. Длина строки учитывает ненулевые байты, а не количество символов.   -  person MarkU    schedule 16.11.2015
comment
Возможно, стоит поискать unicode c++ std::string: stackoverflow.com/   -  person MarkU    schedule 16.11.2015
comment
Грустно, но факт: поддержка Unicode отстой почти на всех языках.   -  person user253751    schedule 16.11.2015
comment
если у вас есть utf-8 вы можете просто использовать std::string, если конечно вам не нужен доступ к конкретному символу по индексу   -  person fghj    schedule 16.11.2015
comment
Хорошо, похоже, что я могу использовать std::string, но ни один из его методов, таких как: length(), substr(), оператор индексации и т. д.... не вернет желаемый результат, поэтому я не получаю многого от используя std::string, кроме контейнера для хранения этих байтов. Я предполагаю, что тогда wstring является лучшим вариантом, поскольку, по крайней мере, он обеспечивает доступ и операции с отдельными символами.   -  person mk33    schedule 16.11.2015
comment
У нас уже есть отличный вопрос по этой теме. Если там чего-то не хватает (и при условии, что на него нет ответа и в другом вопросе C++/Unicode), не стесняйтесь задавать новый вопрос. Если вы это сделаете, сделайте ссылку на существующие вопросы, которые вы уже проверили.   -  person MSalters    schedule 16.11.2015