Что я могу сделать, чтобы решить эту проблему? Должен ли я
сделать много дополнительного руководства
кодирование? Как я понимаю,
std :: string не заботится о
кодирование, только байты, поэтому, когда я
передайте строку Unicode и напишите
в файл, конечно, этот файл должен
содержать одинаковые байты и быть
распознан как файл в кодировке UTF-8?
Вы правы, что std::string
кодирует агностик. Он просто содержит массив char
элементов. То, как эти char
элементы интерпретируются как текст, зависит от среды. Если для вашей локали не задана какая-либо форма Unicode (то есть UTF-8 или UTF-16), то при выводе строки она не будет отображаться / интерпретироваться как Unicode.
Вы уверены, что ваш строковый литерал "abcdefgàèíüŷÀ" на самом деле Unicode, а не, например, Latin-1 ? (ISO-8859-1 или, возможно, Windows-1252)? Вам необходимо определить, на какой локали настроена ваша платформа в данный момент.
----------- EDIT -----------
Мне кажется, я знаю вашу проблему: некоторые из этих символов Unicode в вашем строковом литерале charset
, такие как акцентированный символ "А", являются двухбайтовыми символами (при условии кодировки UTF-8) , Когда вы обращаетесь к строке набора символов с помощью оператора []
в вашей функции random_string
, вы возвращаете half символа Unicode. Таким образом, функция random-string
создает недопустимую строку символов.
Например, рассмотрим следующий код:
std::string s = "À";
std::cout << s.length() << std::endl;
В среде, где строковый литерал интерпретируется как UTF-8, эта программа выведет 2
. Следовательно, первый символ строки (s[0]
) - это всего лишь половина символа Unicode, и, следовательно, он недопустим. Поскольку ваша функция random_string
обращается к строке отдельными байтами с помощью оператора []
, вы создаете недопустимые случайные строки.
Так что да, вам нужно использовать std::wstring
и создать строковый литерал кодировки, используя префикс L
.