windows_utf16to8.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. //
  2. // $Id$
  3. //
  4. #include<__vic/windows/wchar.h>
  5. #include<__vic/utf16/reader.h>
  6. #include<__vic/utf8/writer.h>
  7. #include<__vic/readers/iterator.h>
  8. #include<__vic/writers/string.h>
  9. #include<__vic/unicode.h>
  10. namespace __vic { namespace windows {
  11. namespace {
  12. //////////////////////////////////////////////////////////////////////////////
  13. class wchar_reader
  14. {
  15. iterator_reader_n<const utf16::code_unit_t *> r;
  16. public:
  17. wchar_reader(const wchar_t *s, size_t n)
  18. : r(reinterpret_cast<const utf16::code_unit_t *>(s), n) {}
  19. utf16::status_t read_unit(utf16::code_unit_t &u)
  20. {
  21. return r.read(u) ? utf16::status::ok : utf16::status::eof;
  22. }
  23. };
  24. //////////////////////////////////////////////////////////////////////////////
  25. } // namespace
  26. //----------------------------------------------------------------------------
  27. std::string utf16to8(const wchar_t *s, size_t len_in_code_points)
  28. {
  29. std::string res; res.reserve(len_in_code_points);
  30. utf_transcode(
  31. utf16::make_reader(wchar_reader(s, len_in_code_points)),
  32. utf8::make_writer(make_string_writer(res))
  33. );
  34. return res;
  35. }
  36. //----------------------------------------------------------------------------
  37. }} // namespace