1//
2// UnicodeConverter.cpp
3//
4// Library: Foundation
5// Package: Text
6// Module: UnicodeConverter
7//
8// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
9// and Contributors.
10//
11// SPDX-License-Identifier: BSL-1.0
12//
13
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
23
24#if !defined(POCO_NO_WSTRING)
25
26
27namespace Poco {
28
29
30void UnicodeConverter::convert(const std::string& utf8String, UTF32String& utf32String)
31{
32 utf32String.clear();
33 UTF8Encoding utf8Encoding;
34 TextIterator it(utf8String, utf8Encoding);
35 TextIterator end(utf8String);
36
37 while (it != end)
38 {
39 int cc = *it++;
40 utf32String += (UTF32Char) cc;
41 }
42}
43
44
45void UnicodeConverter::convert(const char* utf8String, std::size_t length, UTF32String& utf32String)
46{
47 if (!utf8String || !length)
48 {
49 utf32String.clear();
50 return;
51 }
52
53 convert(std::string(utf8String, utf8String + length), utf32String);
54}
55
56
57void UnicodeConverter::convert(const char* utf8String, UTF32String& utf32String)
58{
59 if (!utf8String || !std::strlen(utf8String))
60 {
61 utf32String.clear();
62 return;
63 }
64
65 convert(utf8String, std::strlen(utf8String), utf32String);
66}
67
68
69void UnicodeConverter::convert(const std::string& utf8String, UTF16String& utf16String)
70{
71 utf16String.clear();
72 UTF8Encoding utf8Encoding;
73 TextIterator it(utf8String, utf8Encoding);
74 TextIterator end(utf8String);
75 while (it != end)
76 {
77 int cc = *it++;
78 if (cc <= 0xffff)
79 {
80 utf16String += (UTF16Char) cc;
81 }
82 else
83 {
84 cc -= 0x10000;
85 utf16String += (UTF16Char) ((cc >> 10) & 0x3ff) | 0xd800;
86 utf16String += (UTF16Char) (cc & 0x3ff) | 0xdc00;
87 }
88 }
89}
90
91
92void UnicodeConverter::convert(const char* utf8String, std::size_t length, UTF16String& utf16String)
93{
94 if (!utf8String || !length)
95 {
96 utf16String.clear();
97 return;
98 }
99
100 convert(std::string(utf8String, utf8String + length), utf16String);
101}
102
103
104void UnicodeConverter::convert(const char* utf8String, UTF16String& utf16String)
105{
106 if (!utf8String || !std::strlen(utf8String))
107 {
108 utf16String.clear();
109 return;
110 }
111
112 convert(std::string(utf8String), utf16String);
113}
114
115
116void UnicodeConverter::convert(const UTF16String& utf16String, std::string& utf8String)
117{
118 utf8String.clear();
119 UTF8Encoding utf8Encoding;
120 UTF16Encoding utf16Encoding;
121 TextConverter converter(utf16Encoding, utf8Encoding);
122 converter.convert(utf16String.data(), (int) utf16String.length() * sizeof(UTF16Char), utf8String);
123}
124
125
126void UnicodeConverter::convert(const UTF32String& utf32String, std::string& utf8String)
127{
128 utf8String.clear();
129 UTF8Encoding utf8Encoding;
130 UTF32Encoding utf32Encoding;
131 TextConverter converter(utf32Encoding, utf8Encoding);
132 converter.convert(utf32String.data(), (int) utf32String.length() * sizeof(UTF32Char), utf8String);
133}
134
135
136void UnicodeConverter::convert(const UTF16Char* utf16String, std::size_t length, std::string& utf8String)
137{
138 utf8String.clear();
139 UTF8Encoding utf8Encoding;
140 UTF16Encoding utf16Encoding;
141 TextConverter converter(utf16Encoding, utf8Encoding);
142 converter.convert(utf16String, (int) length * sizeof(UTF16Char), utf8String);
143}
144
145
146void UnicodeConverter::convert(const UTF32Char* utf32String, std::size_t length, std::string& utf8String)
147{
148 toUTF8(UTF32String(utf32String, length), utf8String);
149}
150
151
152void UnicodeConverter::convert(const UTF16Char* utf16String, std::string& utf8String)
153{
154 toUTF8(utf16String, UTFStrlen(utf16String), utf8String);
155}
156
157
158void UnicodeConverter::convert(const UTF32Char* utf32String, std::string& utf8String)
159{
160 toUTF8(utf32String, UTFStrlen(utf32String), utf8String);
161}
162
163
164} // namespace Poco
165
166
167#endif // POCO_OS_FAMILY_WINDOWS && !POCO_NO_WSTRING
168