uint32_t CPDF_CIDFont::CharCodeFromUnicode(FX_WCHAR unicode) const { uint32_t charcode = CPDF_Font::CharCodeFromUnicode(unicode); if (charcode) return charcode; switch (m_pCMap->m_Coding) { case CIDCODING_UNKNOWN: return 0; case CIDCODING_UCS2: case CIDCODING_UTF16: return unicode; case CIDCODING_CID: { if (!m_pCID2UnicodeMap || !m_pCID2UnicodeMap->IsLoaded()) return 0; uint32_t CID = 0; while (CID < 65536) { FX_WCHAR this_unicode = m_pCID2UnicodeMap->UnicodeFromCID(static_cast<uint16_t>(CID)); if (this_unicode == unicode) return CID; CID++; } break; } } if (unicode < 0x80) return static_cast<uint32_t>(unicode); if (m_pCMap->m_Coding == CIDCODING_CID) return 0; #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ uint8_t buffer[32]; int ret = FXSYS_WideCharToMultiByte( g_CharsetCPs[m_pCMap->m_Coding], 0, &unicode, 1, reinterpret_cast<char*>(buffer), 4, nullptr, nullptr); if (ret == 1) return buffer[0]; if (ret == 2) return buffer[0] * 256 + buffer[1]; #else if (m_pCMap->m_pEmbedMap) { return EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, unicode); } #endif return 0; }
CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, FX_LPCSTR defchar) { if (destcp == 0) { if (unicode < 0x80) { return CFX_ByteString((char)unicode); } FX_LPCSTR altstr = FCS_GetAltStr(unicode); if (altstr) { return CFX_ByteString(altstr, -1); } return CFX_ByteString(defchar, -1); } FX_BOOL bDef = FALSE; char buf[10]; int ret = FXSYS_WideCharToMultiByte(destcp, 0, (wchar_t*)&unicode, 1, buf, 10, NULL, &bDef); if (ret && !bDef) { return CFX_ByteString(buf, ret); } FX_LPCSTR altstr = FCS_GetAltStr(unicode); if (altstr) { return CFX_ByteString(altstr, -1); } return CFX_ByteString(defchar, -1); }