Chapter 12. iconv(3) IO filter

x::iconviofilter is an IO filter, virtually derived from x::iofilter<char, char> that implements the iconv(3) interface as an IO filter.

The constructor takes two parameters, the input character set and the output character set. The filter() function consumes available input and/or writes to the available output buffer, performing the requested character conversion:

#include <fstream>
#include <iterator>
#include <algorithm>
#include <x/basicstreambufiofilter.H>
#include <x/iconviofilter.H>

class utf8toucs4 : public x::basic_istreambufiofilter<char, char>,
		   public x::iconviofilter,
		   virtual public x::iofilter<char, char> {
public:
	utf8toucs4(std::istream &i)
		: x::basic_istreambufiofilter<char, char>(i),
		  x::iconviofilter("UTF-8", "UCS-4BE")
	{
	}

	~utf8toucs4() noexcept
	{
	}

	void filter()
	{
		x::iconviofilter::filter();
	}
};

int main(int argc, char **argv)
{
	if (argc > 1)
	{
		std::vector<unsigned char> buf;

		try
		{
			std::ifstream i(argv[1]);

			if (i.is_open())
			{
				utf8toucs4 conv(i);

				std::istream i2(&conv);

				std::copy(std::istreambuf_iterator<char>(i2),
					  std::istreambuf_iterator<char>(),
					  std::back_insert_iterator
					  <std::vector<unsigned char> >(buf));
			}
		}
		catch (x::exception &e)
		{
			std::cerr << e << std::endl;
			return 1;
		}

		size_t cnt=0;
		uint32_t n=0;

		for (std::vector<unsigned char>::const_iterator
			     b(buf.begin()), e(buf.end()); b != e; ++b)
		{
			n= (n << 8) | *b;

			if ((++cnt % 4) == 0)
			{
				std::cout << n << std::endl;
			}
		}
	}
	return 0;
}