2017-01-20 4 views
1

plain string Здесь имеет вид кодирования, который:Есть ли способ сделать обмен между utf-8 и простой строкой независимой от платформы?

  • Простая строка-буквальным, такие как "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 

Насколько я знаю, мой sysytem (окна 10 x64) используют GB2312 кодировку для такой простой строки.

Но как преобразовать их в (и конвертировать назад) другую кодировку, такую ​​как utf-8, в платформу-независимый способ?

+0

Вы имеете в виду 'экспериментальный' вместо' expermantal'? – Danh

+0

Я изменил их. – ChungkingExpress

+0

Вы пытались сохранить исходный файл в utf-8 с (и без) спецификацией? – Danh

ответ

0

Это простой вопрос, но на самом деле это чрезвычайно сложная проблема.

Короткий ответ: возможен переход туда от GB2312 до UTF-8, затем обратно в GB2312, но вы не можете выполнить конверсию в оба конца от UTF-8 до GB2312, а затем обратно в UTF-8.

Более длинный ответ: любая строка, которая может быть представлена ​​стандартным образом, может быть выражена в Юникоде, а любая строка, которая может быть выражена в Юникоде, может быть закодирована в UTF-8.

Обратное неверно. Преобразование произвольной строки Unicode в любую другую (стандартную) кодировку невозможно.

Юникод содержит 1,114,112 пунктов кода. Для представления этого много разных точек требуется не менее трех байтов. UTF-8 может представлять любую из этих кодовых точек.

GB2312 (AKA Simplified Chinese) содержит 6000 + кодовых точек, поэтому существует много кодов Unicode, которые не имеют соответствующей записи в GB2312. Вот почему кодировка UTF-8 в GB3213 всегда будет иметь потери. Поэтому теоретически конвертация в оба конца невозможна.

Это, как говорится, есть преобразователи с наилучшим усилием от UTF-8 до GB2312, и нет причин, по которым они не должны быть независимыми от платформы. Поиск в Google UTF-8 to GB2312 conversion находит много возможностей, большинство из которых не зависят от какой-либо конкретной платформы.

Предлагаю вам выполнить этот поиск и выбрать результат, соответствующий вашим потребностям.

Одна платформа-независимое решением для преобразования между кодировками является boost.locale Полного объяснения того, что он может сделать для вас за то, что бы поместиться в переполнении стека отвечать < юмора >, даже если я использую поле. </юмор >.

Для дополнительного считывания: this page provides useful background information for understanding string encoding issues.

+0

Ну. Спасибо за ваш совет.Во всяком случае, я не говорю о том, как конвертировать между UTF-8 и GB2312, но о том, как конвертировать между UTF-8 и «кодировкой, использующей обычную строку, и всеми функциями std», особенно мой компилятор - GB2312, вот и все , Я хочу независимый от платформы способ сделать это, чтобы мои коды корректно работали на всех платформах. – ChungkingExpress