UnicodeConverter.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //
  2. // UnicodeConverter.cpp
  3. //
  4. // $Id: //poco/1.4/Foundation/src/UnicodeConverter.cpp#1 $
  5. //
  6. // Library: Foundation
  7. // Package: Text
  8. // Module: UnicodeConverter
  9. //
  10. // Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
  11. // and Contributors.
  12. //
  13. // SPDX-License-Identifier: BSL-1.0
  14. //
  15. #include "Poco/UnicodeConverter.h"
  16. #include "Poco/TextConverter.h"
  17. #include "Poco/TextIterator.h"
  18. #include "Poco/UTF8Encoding.h"
  19. #include "Poco/UTF16Encoding.h"
  20. #include "Poco/UTF32Encoding.h"
  21. #include <cstring>
  22. namespace Poco {
  23. void UnicodeConverter::convert(const std::string& utf8String, UTF32String& utf32String)
  24. {
  25. utf32String.clear();
  26. UTF8Encoding utf8Encoding;
  27. TextIterator it(utf8String, utf8Encoding);
  28. TextIterator end(utf8String);
  29. while (it != end)
  30. {
  31. int cc = *it++;
  32. utf32String += (UTF32Char) cc;
  33. }
  34. }
  35. void UnicodeConverter::convert(const char* utf8String, std::size_t length, UTF32String& utf32String)
  36. {
  37. if (!utf8String || !length)
  38. {
  39. utf32String.clear();
  40. return;
  41. }
  42. convert(std::string(utf8String, utf8String + length), utf32String);
  43. }
  44. void UnicodeConverter::convert(const char* utf8String, UTF32String& utf32String)
  45. {
  46. if (!utf8String || !std::strlen(utf8String))
  47. {
  48. utf32String.clear();
  49. return;
  50. }
  51. convert(utf8String, std::strlen(utf8String), utf32String);
  52. }
  53. void UnicodeConverter::convert(const std::string& utf8String, UTF16String& utf16String)
  54. {
  55. utf16String.clear();
  56. UTF8Encoding utf8Encoding;
  57. TextIterator it(utf8String, utf8Encoding);
  58. TextIterator end(utf8String);
  59. while (it != end)
  60. {
  61. int cc = *it++;
  62. if (cc <= 0xffff)
  63. {
  64. utf16String += (UTF16Char) cc;
  65. }
  66. else
  67. {
  68. cc -= 0x10000;
  69. utf16String += (UTF16Char) ((cc >> 10) & 0x3ff) | 0xd800;
  70. utf16String += (UTF16Char) (cc & 0x3ff) | 0xdc00;
  71. }
  72. }
  73. }
  74. void UnicodeConverter::convert(const char* utf8String, std::size_t length, UTF16String& utf16String)
  75. {
  76. if (!utf8String || !length)
  77. {
  78. utf16String.clear();
  79. return;
  80. }
  81. convert(std::string(utf8String, utf8String + length), utf16String);
  82. }
  83. void UnicodeConverter::convert(const char* utf8String, UTF16String& utf16String)
  84. {
  85. if (!utf8String || !std::strlen(utf8String))
  86. {
  87. utf16String.clear();
  88. return;
  89. }
  90. convert(std::string(utf8String), utf16String);
  91. }
  92. void UnicodeConverter::convert(const UTF16String& utf16String, std::string& utf8String)
  93. {
  94. utf8String.clear();
  95. UTF8Encoding utf8Encoding;
  96. UTF16Encoding utf16Encoding;
  97. TextConverter converter(utf16Encoding, utf8Encoding);
  98. converter.convert(utf16String.data(), (int) utf16String.length() * sizeof(UTF16Char), utf8String);
  99. }
  100. void UnicodeConverter::convert(const UTF32String& utf32String, std::string& utf8String)
  101. {
  102. utf8String.clear();
  103. UTF8Encoding utf8Encoding;
  104. UTF32Encoding utf32Encoding;
  105. TextConverter converter(utf32Encoding, utf8Encoding);
  106. converter.convert(utf32String.data(), (int) utf32String.length() * sizeof(UTF32Char), utf8String);
  107. }
  108. void UnicodeConverter::convert(const UTF16Char* utf16String, std::size_t length, std::string& utf8String)
  109. {
  110. utf8String.clear();
  111. UTF8Encoding utf8Encoding;
  112. UTF16Encoding utf16Encoding;
  113. TextConverter converter(utf16Encoding, utf8Encoding);
  114. converter.convert(utf16String, (int) length * sizeof(UTF16Char), utf8String);
  115. }
  116. void UnicodeConverter::convert(const UTF32Char* utf32String, std::size_t length, std::string& utf8String)
  117. {
  118. toUTF8(UTF32String(utf32String, length), utf8String);
  119. }
  120. void UnicodeConverter::convert(const UTF16Char* utf16String, std::string& utf8String)
  121. {
  122. toUTF8(utf16String, UTFStrlen(utf16String), utf8String);
  123. }
  124. void UnicodeConverter::convert(const UTF32Char* utf32String, std::string& utf8String)
  125. {
  126. toUTF8(utf32String, UTFStrlen(utf32String), utf8String);
  127. }
  128. } // namespace Poco