在使用UTF8-CPP从UTF32到UTF8的对话期间,我收到错误" utf8 :: invalid_code_point"

时间:2018-01-27 09:00:27

标签: c++ linux utf-8 utf-32

我的程序以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 个答案:

答案 0 :(得分:1)

大多数var ss = SpreadsheetApp.getActiveSheet(); var s = ss.getActiveSheet(); var r = s.getActiveRange(); 发行版上的命令都会传入Linux,因此您需要在收到时将其转换为UTF-8,然后在打印时将其转换回来。< / p>

或者你可以在程序中创建一个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库,标准库也有自己的库,但它们不易使用。

你可以编写更好的函数来包装它们,就像这里的答案一样:

Any good solutions for C++ string code point and code unit?

答案 1 :(得分:0)

很可能argv[1]已经存储了Utf-8编码。因为这是在Linux中处理Unicode的默认方式。请注意,std::stringchar的C样式空终止数组无法正确表示utf32字符,因为每个项目占用4个字节。