void charsetConverter_Win::convert(const string& s_In, string& s_Out) { if (m_source == m_dest) { // No conversion needed s_Out = s_In; return; } int s32_CpSrc = getCodePage(m_source.getName().c_str()); int s32_CpDst = getCodePage(m_dest .getName().c_str()); wstring s_UniBuffer; WCHAR* u16_UniPtr = NULL; int s32_UniLen = 0; if (s32_CpSrc == CP_UNICODE) { u16_UniPtr = (WCHAR*)s_In.c_str(); s32_UniLen = s_In.length() / 2; } else { int s32_BufSize = s_In.length() * 2; // in wide characters s_UniBuffer.resize(s32_BufSize); u16_UniPtr = (WCHAR*)s_UniBuffer.c_str(); s32_UniLen = MultiByteToWideChar(s32_CpSrc, 0, s_In.c_str(), s_In.length(), u16_UniPtr, s32_BufSize); } if (s32_CpDst == CP_UNICODE) { s_Out.assign((const char*)u16_UniPtr, s32_UniLen *2); } else { int s32_BufSize = s32_UniLen * 6; // in multibyte characters string s_Buffer; s_Buffer.resize(s32_BufSize); char* s8_Buffer = (char*)s_Buffer.c_str(); int s32_Len = WideCharToMultiByte(s32_CpDst, 0, u16_UniPtr, s32_UniLen, s8_Buffer, s32_BufSize, 0, NULL); s_Out.assign(s8_Buffer, s32_Len); } }
librevenge::RVNGString libvisio::VSDMetaData::readCodePageString(librevenge::RVNGInputStream *input) { uint32_t size = readU32(input); if (size > getRemainingLength(input)) size = getRemainingLength(input); if (size == 0) return librevenge::RVNGString(); std::vector<unsigned char> characters; for (uint32_t i = 0; i < size; ++i) characters.push_back(readU8(input)); uint32_t codepage = getCodePage(); librevenge::RVNGString string; if (codepage == 65001) { // http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130%28v=vs.85%29.aspx // says this is UTF-8. characters.push_back(0); string.append(reinterpret_cast<const char *>(characters.data())); } else { UErrorCode status = U_ZERO_ERROR; UConverter *conv = nullptr; switch (codepage) { case 1252: // http://msdn.microsoft.com/en-us/goglobal/bb964654 conv = ucnv_open("windows-1252", &status); break; } if (U_SUCCESS(status) && conv) { assert(!characters.empty()); const auto *src = (const char *)&characters[0]; const char *srcLimit = (const char *)src + characters.size(); while (src < srcLimit) { UChar32 ucs4Character = ucnv_getNextUChar(conv, &src, srcLimit, &status); if (U_SUCCESS(status) && U_IS_UNICODE_CHAR(ucs4Character)) appendUCS4(string, ucs4Character); } } if (conv) ucnv_close(conv); } return string; }
static PassOwnPtr<TextCodec> newTextCodecWin(const TextEncoding& encoding, const void*) { return adoptPtr(new TextCodecWin(getCodePage(encoding.name()))); }
void TDisplay::updateIntlChars() { if(getCodePage() != 437 ) TFrame::frameChars[30] = 'м'; }