summaryrefslogtreecommitdiff
path: root/core/fxcrt/fx_basic_utf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcrt/fx_basic_utf.cpp')
-rw-r--r--core/fxcrt/fx_basic_utf.cpp38
1 files changed, 27 insertions, 11 deletions
diff --git a/core/fxcrt/fx_basic_utf.cpp b/core/fxcrt/fx_basic_utf.cpp
index 4dbfa37284..fcfd5934e4 100644
--- a/core/fxcrt/fx_basic_utf.cpp
+++ b/core/fxcrt/fx_basic_utf.cpp
@@ -10,9 +10,11 @@ void CFX_UTF8Decoder::Clear() {
m_Buffer.Clear();
m_PendingBytes = 0;
}
+
void CFX_UTF8Decoder::AppendChar(uint32_t ch) {
m_Buffer.AppendChar((wchar_t)ch);
}
+
void CFX_UTF8Decoder::Input(uint8_t byte) {
if (byte < 0x80) {
m_PendingBytes = 0;
@@ -43,37 +45,51 @@ void CFX_UTF8Decoder::Input(uint8_t byte) {
m_PendingChar = (byte & 0x01) << 30;
}
}
-void CFX_UTF8Encoder::Input(wchar_t unicode) {
- if ((uint32_t)unicode < 0x80) {
- m_Buffer.AppendChar(unicode);
+
+CFX_UTF8Encoder::CFX_UTF8Encoder() {}
+
+CFX_UTF8Encoder::~CFX_UTF8Encoder() {}
+
+void CFX_UTF8Encoder::Input(wchar_t unicodeAsWchar) {
+ uint32_t unicode = static_cast<uint32_t>(unicodeAsWchar);
+ if (unicode < 0x80) {
+ m_Buffer.push_back(unicode);
} else {
- if ((uint32_t)unicode >= 0x80000000) {
+ if (unicode >= 0x80000000) {
return;
}
int nbytes = 0;
- if ((uint32_t)unicode < 0x800) {
+ if (unicode < 0x800) {
nbytes = 2;
- } else if ((uint32_t)unicode < 0x10000) {
+ } else if (unicode < 0x10000) {
nbytes = 3;
- } else if ((uint32_t)unicode < 0x200000) {
+ } else if (unicode < 0x200000) {
nbytes = 4;
- } else if ((uint32_t)unicode < 0x4000000) {
+ } else if (unicode < 0x4000000) {
nbytes = 5;
} else {
nbytes = 6;
}
static uint8_t prefix[] = {0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
int order = 1 << ((nbytes - 1) * 6);
- int code = unicode;
- m_Buffer.AppendChar(prefix[nbytes - 2] | (code / order));
+ int code = unicodeAsWchar;
+ m_Buffer.push_back(prefix[nbytes - 2] | (code / order));
for (int i = 0; i < nbytes - 1; i++) {
code = code % order;
order >>= 6;
- m_Buffer.AppendChar(0x80 | (code / order));
+ m_Buffer.push_back(0x80 | (code / order));
}
}
}
+void CFX_UTF8Encoder::AppendStr(const CFX_ByteStringC& str) {
+ m_Buffer.insert(m_Buffer.end(), str.begin(), str.end());
+}
+
+CFX_ByteStringC CFX_UTF8Encoder::GetResult() const {
+ return CFX_ByteStringC(m_Buffer.data(), m_Buffer.size());
+}
+
CFX_ByteString FX_UTF8Encode(const CFX_WideStringC& wsStr) {
FX_STRSIZE len = wsStr.GetLength();
const wchar_t* pStr = wsStr.unterminated_c_str();