diff --git a/DesktopEditor/common/StringExt.cpp b/DesktopEditor/common/StringExt.cpp index d2828f6a11..add5110bd5 100644 --- a/DesktopEditor/common/StringExt.cpp +++ b/DesktopEditor/common/StringExt.cpp @@ -226,6 +226,63 @@ namespace NSStringExt return sRet; } + std::string CConverter::GetUtf8FromUTF32(const unsigned int* pUnicodes, long lCount) + { + unsigned char* pData = new unsigned char[6 * lCount + 3 + 1]; + unsigned char* pCodesCur = pData; + long lOutputCount = 0; + + for (int i = 0; i < lCount; i++) + { + unsigned int code = *pUnicodes++; + + if (code < 0x80) + { + *pCodesCur++ = (unsigned char)code; + } + else if (code < 0x0800) + { + *pCodesCur++ = 0xC0 | (code >> 6); + *pCodesCur++ = 0x80 | (code & 0x3F); + } + else if (code < 0x10000) + { + *pCodesCur++ = 0xE0 | (code >> 12); + *pCodesCur++ = 0x80 | (code >> 6 & 0x3F); + *pCodesCur++ = 0x80 | (code & 0x3F); + } + else if (code < 0x1FFFFF) + { + *pCodesCur++ = 0xF0 | (code >> 18); + *pCodesCur++ = 0x80 | (code >> 12 & 0x3F); + *pCodesCur++ = 0x80 | (code >> 6 & 0x3F); + *pCodesCur++ = 0x80 | (code & 0x3F); + } + else if (code < 0x3FFFFFF) + { + *pCodesCur++ = 0xF8 | (code >> 24); + *pCodesCur++ = 0x80 | (code >> 18 & 0x3F); + *pCodesCur++ = 0x80 | (code >> 12 & 0x3F); + *pCodesCur++ = 0x80 | (code >> 6 & 0x3F); + *pCodesCur++ = 0x80 | (code & 0x3F); + } + else if (code < 0x7FFFFFFF) + { + *pCodesCur++ = 0xFC | (code >> 30); + *pCodesCur++ = 0x80 | (code >> 24 & 0x3F); + *pCodesCur++ = 0x80 | (code >> 18 & 0x3F); + *pCodesCur++ = 0x80 | (code >> 12 & 0x3F); + *pCodesCur++ = 0x80 | (code >> 6 & 0x3F); + *pCodesCur++ = 0x80 | (code & 0x3F); + } + } + + lOutputCount = (long)(pCodesCur - pData); + *pCodesCur++ = 0; + std::string s((char*)pData, lOutputCount); + delete [] pData; + return s; + } unsigned int* CConverter::GetUtf32FromUnicode(const std::wstring& wsUnicodeText, unsigned int& unLen) { if (wsUnicodeText.size() <= 0) diff --git a/DesktopEditor/common/StringExt.h b/DesktopEditor/common/StringExt.h index 986b46f23a..0304354afe 100644 --- a/DesktopEditor/common/StringExt.h +++ b/DesktopEditor/common/StringExt.h @@ -131,6 +131,7 @@ namespace NSStringExt static std::wstring GetUnicodeFromSingleByteString(const unsigned char* pData, long lCount, ESingleByteEncoding eType = SINGLE_BYTE_ENCODING_DEFAULT); static std::wstring GetUnicodeFromUTF16(const unsigned short* pData, long lCount); static std::wstring GetUnicodeFromUTF32(const unsigned int* pData, long lCount); + static std::string GetUtf8FromUTF32(const unsigned int* pData, long lCount); static unsigned int* GetUtf32FromUnicode(const std::wstring& wsUnicodeText, unsigned int& unLen); static unsigned short* GetUtf16FromUnicode(const std::wstring& wsUnicodeText, unsigned int& unLen, const bool& isLE = true); }; diff --git a/PdfReader/PdfReader.cpp b/PdfReader/PdfReader.cpp index 306effb5e9..f7d36d8628 100644 --- a/PdfReader/PdfReader.cpp +++ b/PdfReader/PdfReader.cpp @@ -55,6 +55,7 @@ #include "lib/xpdf/Link.h" #include "lib/xpdf/TextOutputDev.h" #include "lib/goo/GList.h" +#include "../DesktopEditor/common/StringExt.h" #endif namespace PdfReader @@ -509,69 +510,12 @@ return 0; // return wsXml; return L""; } -#ifdef BUILDING_WASM_MODULE - std::string GetUtf8StringFromUnicode_4bytes(Unicode* pUnicodes, LONG lCount) - { - BYTE* pData = new BYTE[6 * lCount + 3 + 1]; - BYTE* pCodesCur = pData; - LONG lOutputCount = 0; - - for (int i = 0; i < lCount; i++) - { - unsigned int code = *pUnicodes++; - - if (code < 0x80) - { - *pCodesCur++ = (BYTE)code; - } - else if (code < 0x0800) - { - *pCodesCur++ = 0xC0 | (code >> 6); - *pCodesCur++ = 0x80 | (code & 0x3F); - } - else if (code < 0x10000) - { - *pCodesCur++ = 0xE0 | (code >> 12); - *pCodesCur++ = 0x80 | (code >> 6 & 0x3F); - *pCodesCur++ = 0x80 | (code & 0x3F); - } - else if (code < 0x1FFFFF) - { - *pCodesCur++ = 0xF0 | (code >> 18); - *pCodesCur++ = 0x80 | (code >> 12 & 0x3F); - *pCodesCur++ = 0x80 | (code >> 6 & 0x3F); - *pCodesCur++ = 0x80 | (code & 0x3F); - } - else if (code < 0x3FFFFFF) - { - *pCodesCur++ = 0xF8 | (code >> 24); - *pCodesCur++ = 0x80 | (code >> 18 & 0x3F); - *pCodesCur++ = 0x80 | (code >> 12 & 0x3F); - *pCodesCur++ = 0x80 | (code >> 6 & 0x3F); - *pCodesCur++ = 0x80 | (code & 0x3F); - } - else if (code < 0x7FFFFFFF) - { - *pCodesCur++ = 0xFC | (code >> 30); - *pCodesCur++ = 0x80 | (code >> 24 & 0x3F); - *pCodesCur++ = 0x80 | (code >> 18 & 0x3F); - *pCodesCur++ = 0x80 | (code >> 12 & 0x3F); - *pCodesCur++ = 0x80 | (code >> 6 & 0x3F); - *pCodesCur++ = 0x80 | (code & 0x3F); - } - } - - lOutputCount = (LONG)(pCodesCur - pData); - *pCodesCur++ = 0; - std::string s((char*)pData, lOutputCount); - RELEASEARRAYOBJECTS(pData); - return s; - } +#ifdef BUILDING_WASM_MODULE void getBookmars(PDFDoc* pdfDoc, OutlineItem* pOutlineItem, NSWasm::CData& out, int level) { int nLengthTitle = pOutlineItem->getTitleLength(); Unicode* pTitle = pOutlineItem->getTitle(); - std::string sTitle = GetUtf8StringFromUnicode_4bytes(pTitle, nLengthTitle); + std::string sTitle = NSStringExt::CConverter::GetUtf8FromUTF32(pTitle, nLengthTitle); LinkAction* pLinkAction = pOutlineItem->getAction(); if (!pLinkAction)