Здесь plain string
имеет вид кодирования, который:
Обычный строковый литерал, такой как "plainstring"
закодировано как;
Все стандартные библиотеки возвращают или принимают. Например:
std::cout << "I'm ok." ; // plain string, ok on my system,
// VS2015 x64 default encoding setting.
std::cout << u8"I'm wrong."; // got error display on my system
std::experimental::filesystem::path path("Some Right specified Path contains non-ASCII chars"); // ok
std::experimental::filesystem::path path2(u8"Some Path specified Path contains non-ASCII chars"); // error
std::experimental::filesystem::directory_iterator r(path); // ok
std::experimental::filesystem::directory_iterator r2(path2); // will throw exception
Как я знаю, мой системный (Windows 10 x64) использовать GB2312
кодировка для такой простой строки.
Но как преобразовать их в (и преобразовать обратно) в другую кодировку, такую как utf-8
независимым от платформы способом
Это простой вопрос, но на самом деле это чрезвычайно сложный вопрос.
Краткий ответ: возможен возврат в оба конца от GB2312 до UTF-8, затем обратно к GB2312, но вы не можете выполнить преобразование в оба конца из UTF-8 в GB2312, а затем обратно в UTF-8.
Более длинный ответ: любая строка, которая может быть представлена в соответствии со стандартами, может быть выражена в Unicode, а любая строка, которая может быть выражена в Unicode, может быть закодирована в UTF-8.
Обратное неверно. Невозможно преобразовать произвольную строку Unicode в любую другую (стандартную) кодировку.
Юникод содержит 1,114,112 кодовых точек. Требуется по крайней мере три байта, чтобы представить это много разных точек. UTF-8 может представлять любую из этих кодовых точек.
GB2312 (упрощенный китайский AKA) содержит более 6000 кодовых точек, поэтому существует много кодовых точек Unicode, для которых нет соответствующей записи в GB2312. Вот почему кодировка UTF-8 — GB3213 всегда будет с потерями. Так что теоретически конверсия в оба конца невозможна.
Тем не менее, существуют конвертеры «из лучших» от UTF-8 до GB2312, и нет никаких причин, по которым они не должны быть независимыми от платформы. Поиск в Google UTF-8 to GB2312 conversion
находит много возможностей, большинство из которых не зависят от конкретной платформы.
Я предлагаю вам сделать этот поиск и выбрать результат, который соответствует вашим потребностям.
Одно независимое от платформы решение для преобразования между кодировками boost.locale Полное объяснение того, что он может сделать для вас, выходит за рамки того, что вписывается в ответ на переполнение стека. <юмор>даже если я использую поля.</юмор>,
Для дополнительного чтения: эта страница содержит полезную справочную информацию для понимания проблем кодирования строк.
Других решений пока нет …