diff options
author | Neil <nyamatongwe@gmail.com> | 2020-06-24 15:00:50 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2020-06-24 15:00:50 +1000 |
commit | 69d678787645b2dd7d0cd40db4aa5c538ab13f9b (patch) | |
tree | 2058ecc0057a30473b082e2cd08a5f766e4eba79 | |
parent | b047c81396af14e5497d969b37b1df9d67d09d17 (diff) | |
download | scintilla-mirror-69d678787645b2dd7d0cd40db4aa5c538ab13f9b.tar.gz |
Converting between UTF-8 and current encoding.
Allows platform-independent code to be written just to handle Unicode.
-rw-r--r-- | cocoa/ScintillaCocoa.h | 3 | ||||
-rw-r--r-- | cocoa/ScintillaCocoa.mm | 32 | ||||
-rwxr-xr-x | gtk/ScintillaGTK.cxx | 18 | ||||
-rwxr-xr-x | gtk/ScintillaGTK.h | 2 | ||||
-rw-r--r-- | qt/ScintillaEditBase/ScintillaQt.cpp | 22 | ||||
-rw-r--r-- | qt/ScintillaEditBase/ScintillaQt.h | 2 | ||||
-rw-r--r-- | src/Editor.h | 3 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 23 |
8 files changed, 105 insertions, 0 deletions
diff --git a/cocoa/ScintillaCocoa.h b/cocoa/ScintillaCocoa.h index b94a30aa2..e75efffef 100644 --- a/cocoa/ScintillaCocoa.h +++ b/cocoa/ScintillaCocoa.h @@ -182,6 +182,9 @@ public: NSPoint GetCaretPosition(); + std::string UTF8FromEncoded(std::string_view encoded) const override; + std::string EncodedFromUTF8(std::string_view utf8) const override; + static sptr_t DirectFunction(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam); NSTimer *timers[tickPlatform+1]; diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index 657651908..e1b11c16a 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -1195,6 +1195,38 @@ NSPoint ScintillaCocoa::GetCaretPosition() { // ------------------------------------------------------------------------------------------------- +std::string ScintillaCocoa::UTF8FromEncoded(std::string_view encoded) const { + if (IsUnicodeMode()) { + return std::string(encoded); + } else { + CFStringEncoding encoding = EncodingFromCharacterSet(IsUnicodeMode(), + vs.styles[STYLE_DEFAULT].characterSet); + CFStringRef cfsVal = CFStringFromString(encoded.data(), encoded.length(), encoding); + std::string utf = EncodedBytesString(cfsVal, kCFStringEncodingUTF8); + if (cfsVal) + CFRelease(cfsVal); + return utf; + } +} + +// ------------------------------------------------------------------------------------------------- + +std::string ScintillaCocoa::EncodedFromUTF8(std::string_view utf8) const { + if (IsUnicodeMode()) { + return std::string(utf8); + } else { + CFStringEncoding encoding = EncodingFromCharacterSet(IsUnicodeMode(), + vs.styles[STYLE_DEFAULT].characterSet); + CFStringRef cfsVal = CFStringFromString(utf8.data(), utf8.length(), kCFStringEncodingUTF8); + const std::string sEncoded = EncodedBytesString(cfsVal, encoding); + if (cfsVal) + CFRelease(cfsVal); + return sEncoded; + } +} + +// ------------------------------------------------------------------------------------------------- + #pragma mark Drag /** diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 61ce04ad0..e3148e9a8 100755 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -816,6 +816,24 @@ bool ScintillaGTK::ValidCodePage(int codePage) const { || codePage == 1361; } +std::string ScintillaGTK::UTF8FromEncoded(std::string_view encoded) const { + if (IsUnicodeMode()) { + return std::string(encoded); + } else { + const char *charSetBuffer = CharacterSetID(); + return ConvertText(encoded.data(), encoded.length(), "UTF-8", charSetBuffer, true); + } +} + +std::string ScintillaGTK::EncodedFromUTF8(std::string_view utf8) const { + if (IsUnicodeMode()) { + return std::string(utf8); + } else { + const char *charSetBuffer = CharacterSetID(); + return ConvertText(utf8.data(), utf8.length(), charSetBuffer, "UTF-8", true); + } +} + sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { try { switch (iMessage) { diff --git a/gtk/ScintillaGTK.h b/gtk/ScintillaGTK.h index a671f5b7a..100abd56b 100755 --- a/gtk/ScintillaGTK.h +++ b/gtk/ScintillaGTK.h @@ -92,6 +92,8 @@ private: Sci::Position TargetAsUTF8(char *text) const; Sci::Position EncodedFromUTF8(const char *utf8, char *encoded) const; bool ValidCodePage(int codePage) const override; + std::string UTF8FromEncoded(std::string_view encoded) const override; + std::string EncodedFromUTF8(std::string_view utf8) const override; public: // Public for scintilla_send_message sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override; private: diff --git a/qt/ScintillaEditBase/ScintillaQt.cpp b/qt/ScintillaEditBase/ScintillaQt.cpp index 374027bd0..761ff78bb 100644 --- a/qt/ScintillaEditBase/ScintillaQt.cpp +++ b/qt/ScintillaEditBase/ScintillaQt.cpp @@ -250,6 +250,28 @@ bool ScintillaQt::ValidCodePage(int codePage) const || codePage == 1361; } +std::string ScintillaQt::UTF8FromEncoded(std::string_view encoded) const { + if (IsUnicodeMode()) { + return std::string(encoded); + } else { + QTextCodec *codec = QTextCodec::codecForName( + CharacterSetID(CharacterSetOfDocument())); + QString text = codec->toUnicode(encoded.data(), static_cast<int>(encoded.length())); + return text.toStdString(); + } +} + +std::string ScintillaQt::EncodedFromUTF8(std::string_view utf8) const { + if (IsUnicodeMode()) { + return std::string(utf8); + } else { + QString text = QString::fromUtf8(utf8.data(), static_cast<int>(utf8.length())); + QTextCodec *codec = QTextCodec::codecForName( + CharacterSetID(CharacterSetOfDocument())); + QByteArray ba = codec->fromUnicode(text); + return std::string(ba.data(), ba.length()); + } +} void ScintillaQt::ScrollText(Sci::Line linesToMove) { diff --git a/qt/ScintillaEditBase/ScintillaQt.h b/qt/ScintillaEditBase/ScintillaQt.h index 5a6f9efa1..64268aa75 100644 --- a/qt/ScintillaEditBase/ScintillaQt.h +++ b/qt/ScintillaEditBase/ScintillaQt.h @@ -104,6 +104,8 @@ private: void Finalise() override; bool DragThreshold(Point ptStart, Point ptNow) override; bool ValidCodePage(int codePage) const override; + std::string UTF8FromEncoded(std::string_view encoded) const override; + std::string EncodedFromUTF8(std::string_view utf8) const override; private: void ScrollText(Sci::Line linesToMove) override; diff --git a/src/Editor.h b/src/Editor.h index 4d01cb16a..60742b403 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -570,6 +570,9 @@ protected: // ScintillaBase subclass needs access to much of Editor int CodePage() const noexcept; virtual bool ValidCodePage(int /* codePage */) const { return true; } + virtual std::string UTF8FromEncoded(std::string_view encoded) const = 0; + virtual std::string EncodedFromUTF8(std::string_view utf8) const = 0; + Sci::Line WrapCount(Sci::Line line); void AddStyledText(const char *buffer, Sci::Position appendLength); diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index d96199170..bde9ef66b 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -403,6 +403,9 @@ class ScintillaWin : UINT CodePageOfDocument() const noexcept; bool ValidCodePage(int codePage) const override; + std::string UTF8FromEncoded(std::string_view encoded) const override; + std::string EncodedFromUTF8(std::string_view utf8) const override; + std::string EncodeWString(std::wstring_view wsv); sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override; void IdleWork() override; @@ -2053,6 +2056,26 @@ bool ScintillaWin::ValidCodePage(int codePage) const { codePage == 950 || codePage == 1361; } +std::string ScintillaWin::UTF8FromEncoded(std::string_view encoded) const { + if (IsUnicodeMode()) { + return std::string(encoded); + } else { + // Pivot through wide string + std::wstring ws = StringDecode(encoded, CodePageOfDocument()); + return StringEncode(ws, SC_CP_UTF8); + } +} + +std::string ScintillaWin::EncodedFromUTF8(std::string_view utf8) const { + if (IsUnicodeMode()) { + return std::string(utf8); + } else { + // Pivot through wide string + std::wstring ws = StringDecode(utf8, SC_CP_UTF8); + return StringEncode(ws, CodePageOfDocument()); + } +} + sptr_t ScintillaWin::DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam); } |