Во время разговора с 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 в файл.

2 ответа

Команда на большинстве 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++ строкового кода и единицы кода?

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

Другие вопросы по тегам