如何从C ++中的8位迭代器获取16位或32位迭代器?

时间:2018-02-24 22:10:46

标签: c++ character-encoding

我编写的代码使用了这个库http://utfcpp.sourceforge.net,它转换了utf16to8:

    ifstream sourceFile("/home/myuser/utf16.txt", std::ifstream::binary);
    vector<unsigned char> res;
    std::vector<uint16_t> my_buffer;

    my_buffer.resize(fileSize/2);
    sourceFile.read((char*) my_buffer.data(), fileSize);

    utf8::utf16to8(my_buffer.begin(),
                   my_buffer.end(),
                   back_inserter(res));
    outFile.write((char*)&res[0], res.size());

我的问题:如果我想转换utf32to8,我必须编写所有这些代码,但在vector中使用不同的类型:

    vector<unsigned char> res;
    std::vector<uint32_t> my_buffer;

    my_buffer.resize(fileSize/4);
    sourceFile.read((char*) my_buffer.data(), fileSize);

    utf8::utf32to8(my_buffer.begin(),
                   my_buffer.end(),
                   back_inserter(res));
    outFile.write((char*)&res[0], res.size());

我正在使用std :: vector和std :: vector,因为lib uf8-cpp需要32位和16位迭代器。有没有办法从std :: vector获取这个迭代器,例如:

std::vector<char> myvector;
std::vector<uint16_t>::iterator u16bit_iterator = myvector.begin(); //this doesn't work now

1 个答案:

答案 0 :(得分:1)

让我们澄清手头的问题。

你有:

std::vector<uint32_t> in;
std::vector<uint8_t>  out;

您希望将in(UTF-32中的数据)转换为out(UTF-8中的数据); in由32位整数填充,因为这是utf8::utf32to8所需的(加上它是有意义的)并且out由8位整数(即字节)填充,这也是有意义的。

现在:

  

我想重构我的代码,只使用一个向量而不是两个不同类型的向量。

暂且不说这是一个弱要求(类型与现在有什么不对?)这可以通过从默认迭代器切换到指针来实现。迭代器std::vector<T>::iterator用于迭代std::vector<T>个句点。你对T的不同选择都是整数并不重要;他们是不同的类型。但是指针可以用作迭代器(特别是当你使用一个连续的数据块时,就像vector包含的那样),并且将任意内存重新解释为字节(仅限)是合法的。

作为奖励,当你回到只读字节时,从文件中读取会更容易(这在某种程度上更有意义)。

std::vector<uint8_t> in;
std::vector<uint8_t> out;

in.resize(fileSize);
sourceFile.read((char*)&in[0], fileSize);

// Make sure you have a whole number of 32-bit
// blocks, before we interpret them as bytes
assert((in.size() % 4) == 0);
utf8::utf32to8(
   (uint32_t*)&in.front(),
   (uint32_t*)&in.back(),
   std::back_inserter(out)
);

outFile.write((char*)&out.front(), out.size());

我希望我能正确解释你的要求。