0

我的程序得到一个 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 写入文件。

4

2 回答 2

1

大多数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以后您不需要使用第 3 方UTF库,标准库有自己的,尽管它们不容易使用。

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

C++ 字符串代码点和代码单元有什么好的解决方案吗?

于 2018-01-27T09:57:32.593 回答
0

很可能argv[1]已经使用 Utf-8 编码存储。因为这是在 Linux 中处理 Unicode 的默认方式。请注意,utf32 字符不能std::string由 C 风格的以空结尾的数组 of正确表示,char因为每个项目占用 4 个字节。

于 2018-01-27T09:07:00.173 回答