我的程序以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 :(得分: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
库,标准库也有自己的库,但它们不易使用。
你可以编写更好的函数来包装它们,就像这里的答案一样:
答案 1 :(得分:0)
很可能argv[1]
已经存储了Utf-8编码。因为这是在Linux中处理Unicode的默认方式。请注意,std::string
或char
的C样式空终止数组无法正确表示utf32字符,因为每个项目占用4个字节。