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);
    }
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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] = 'м';
}