Во время разговора с UTF32 на UTF8 с использованием UTF8-CPP я получаю сообщение об ошибке «utf8 :: invalid_code_point»

Моя программа получает входную китайскую строку в кодировке utf32:

./myprogram 我想玩

Я хочу преобразовать это в utf8, для этого я использую библиотеку UTF8-CPP http://utfcpp.sourceforge.net

#include "source/utf8.h"using namespace std;
int main(int argc, char** argv)
{
printf("argv[1] = %s \n", argv[1]);
string str = argv[1];
printf("str = %s \n", str);

vector<unsigned char> utf8result;
utf8::utf32to8(str.begin(), str.end(), back_inserter(utf8result));

Я получил следующий вывод в терминале:

argv[1] = 系
str =  D�k�
terminate called after throwing an instance of 'utf8::invalid_code_point'
what():  Invalid code point

Как исправить этот код, чтобы разговор utf32to8 был успешным?
Что я делаю не так, пожалуйста, объясните мне?
После этого я хочу записать полученный utf8 в файл.

0

Решение

Команда на большинстве Linux Распределение проходит в UTF-8 в, так что вам нужно преобразовать его в UTF-32 когда вы получите его, а затем преобразовать его обратно, когда вы распечатаете его.

Или вы могли бы создать UTF-32 строка в программе например. std::u32string u32s = U"我想玩";

#include "source/utf8.h"
int main()
{
std::u32string u32s = U"我想玩";

std::string u8s;
utf8::utf32to8(u32s.begin(), u32s.end(), std::back_inserter(u8s));

std::cout << u8s << '\n';
}

Замечания:

От C++11 далее вам не нужно использовать третье лицо UTF библиотеки, стандартная библиотека имеет свои, хотя они не просты в использовании.

Вы можете написать более приятные функции, чтобы обернуть их, как в этом ответе здесь:

Какие-нибудь хорошие решения для C ++ строкового кода и единицы кода?

1

Другие решения

Более вероятный argv[1] уже хранится с кодировкой Utf-8. Потому что это стандартный способ обработки Unicode в Linux. Обратите внимание, что символы utf32 не могут быть правильно представлены std::string или с помощью терминируемого массива в стиле C char потому что каждый элемент занимает 4 байта.

0

По вопросам рекламы [email protected]