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.cpp97
1 files changed, 53 insertions, 44 deletions
diff --git a/core/fxcrt/fx_basic_utf.cpp b/core/fxcrt/fx_basic_utf.cpp
index 084553b671..1bcae61fe9 100644
--- a/core/fxcrt/fx_basic_utf.cpp
+++ b/core/fxcrt/fx_basic_utf.cpp
@@ -6,6 +6,59 @@
#include "core/fxcrt/fx_basic.h"
+#include <vector>
+
+namespace {
+
+class CFX_UTF8Encoder {
+ public:
+ CFX_UTF8Encoder() {}
+ ~CFX_UTF8Encoder() {}
+
+ void Input(wchar_t unicodeAsWchar) {
+ uint32_t unicode = static_cast<uint32_t>(unicodeAsWchar);
+ if (unicode < 0x80) {
+ m_Buffer.push_back(unicode);
+ } else {
+ if (unicode >= 0x80000000)
+ return;
+
+ int nbytes = 0;
+ if (unicode < 0x800)
+ nbytes = 2;
+ else if (unicode < 0x10000)
+ nbytes = 3;
+ else if (unicode < 0x200000)
+ nbytes = 4;
+ 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 = 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.push_back(0x80 | (code / order));
+ }
+ }
+ }
+
+ // The data returned by GetResult() is invalidated when this is modified by
+ // appending any data.
+ CFX_ByteStringC GetResult() const {
+ return CFX_ByteStringC(m_Buffer.data(), m_Buffer.size());
+ }
+
+ private:
+ std::vector<uint8_t> m_Buffer;
+};
+
+} // namespace
+
void CFX_UTF8Decoder::Clear() {
m_Buffer.Clear();
m_PendingBytes = 0;
@@ -46,50 +99,6 @@ void CFX_UTF8Decoder::Input(uint8_t byte) {
}
}
-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 (unicode >= 0x80000000) {
- return;
- }
- int nbytes = 0;
- if (unicode < 0x800) {
- nbytes = 2;
- } else if (unicode < 0x10000) {
- nbytes = 3;
- } else if (unicode < 0x200000) {
- nbytes = 4;
- } 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 = 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.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();