Моя программа получает входную китайскую строку в кодировке 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 в файл.
Команда на большинстве 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 байта.