示例#1
0
bool CCharsetConvert::MultiByteToUtf16(unsigned char *pMultiByte, int nMultiByteSize, unsigned char *pUTF16, int *pUTF16Size, int nCodePage)
{
#ifdef WIN32
	bool bReturn = false;
	int nByteNeed = ::MultiByteToWideChar(nCodePage,0,LPCSTR(pMultiByte),nMultiByteSize,NULL,0);
	if (nByteNeed > 0
		&& (int)(nByteNeed*sizeof(WCHAR)) < *pUTF16Size)
	{
		*pUTF16Size = 0;
		nByteNeed = MultiByteToWideChar(nCodePage,0,LPCSTR(pMultiByte),nMultiByteSize,(LPWSTR)pUTF16,nByteNeed);
		if (nByteNeed > 0)
		{
			bReturn = true;
			*pUTF16Size = nByteNeed * sizeof(WCHAR);
		}
	}

	return bReturn;
#else

	iconv_t cd;
	bool bReturn = false;

	cd = iconv_open("UTF-16LE",GetCodePageName(nCodePage));
	if(cd == 0)
	{
		return false;
	}

	size_t nMultiSize = (size_t)nMultiByteSize;
	size_t nOriginLen = *pUTF16Size;
	size_t nOut = *pUTF16Size;
	size_t nresult = iconv(cd,(char**)&pMultiByte,&nMultiSize,(char**)&pUTF16,&nOut);
	if (nresult != (size_t)(-1))
	{
		bReturn = true;
		*pUTF16Size = nOriginLen - nOut;
	}

	iconv_close(cd);

	return bReturn;


#endif // WIN32
}
示例#2
0
bool CCharsetConvert::Utf16ToMultiByte(unsigned char *pUTF16, int nUTF16Size, unsigned char *pMultiByte, int *pMultiByteSize, int nCodePage)
{
#ifdef WIN32
	bool bReturn = false;

	int nByteNeed = WideCharToMultiByte(nCodePage,0,LPCWSTR(pUTF16),nUTF16Size/sizeof(WCHAR),NULL,0,NULL,NULL);
	if (nByteNeed > 0
		&& nByteNeed < *pMultiByteSize)
	{
		*pMultiByteSize = 0;
		nByteNeed = WideCharToMultiByte(nCodePage,0,LPCWSTR(pUTF16),nUTF16Size/sizeof(WCHAR),(LPSTR)pMultiByte,nByteNeed,NULL,NULL);
		if (nByteNeed > 0)
		{
			bReturn = true;
			*pMultiByteSize = nByteNeed;
		}
	}

	return bReturn;
#else
	iconv_t cd;
	bool bReturn = false;

	cd = iconv_open(GetCodePageName(nCodePage),"UTF-16LE");
	if(cd == 0)
	{
		return false;
	}

	size_t nUtf16Size = nUTF16Size;
	size_t nOriginLen = *pMultiByteSize;
	size_t nOut = *pMultiByteSize;
	size_t nresult = iconv(cd,(char**)&pUTF16,&nUtf16Size,(char**)&pMultiByte,&nOut);
	if (nresult != (size_t)(-1))
	{
		bReturn = true;
		*pMultiByteSize = nOriginLen - nOut;
	}

	iconv_close(cd);

	return bReturn;
#endif // WIN32
}
示例#3
0
//---------------------------------------------------------------------------
void __fastcall TEditorForm::LoadFromFile(bool PrimaryEncoding)
{
  TStream * Stream = new TFileStream(FFileName, fmOpenRead | fmShareDenyWrite);
  try
  {
    bool CanTrySecondary;
    if (FEncoding == NULL)
    {
      int Encoding;
      if (ContainsPreamble(Stream, TEncoding::UTF8->GetPreamble()))
      {
        Encoding = CP_UTF8;
        CanTrySecondary = false;
      }
      else
      {
        Encoding = WinConfiguration->Editor.Encoding;
        CanTrySecondary = true;
      }

      switch (Encoding)
      {
        case CP_UTF8:
          FEncoding = PrimaryEncoding ? TEncoding::UTF8 : TEncoding::Default;
          break;

        default:
          CanTrySecondary = false;
          FAIL;
          // fallthru

        case CP_ACP:
          FEncoding = PrimaryEncoding ? TEncoding::Default : TEncoding::UTF8;
          break;
      }
    }
    else
    {
      CanTrySecondary = false;
    }

    FEncodingName = GetCodePageName(FEncoding);

    bool EncodingError;
    if (!EditorMemo->LoadFromStream(Stream, FEncoding, EncodingError))
    {
      if (EncodingError)
      {
        UnicodeString Message = FMTLOAD(EDITOR_ENCODING_ERROR, (FFileName, FEncodingName));

        if (CanTrySecondary)
        {
          TEncoding * EncodingBackup = FEncoding;
          UnicodeString EncodingNameBackup = FEncodingName;

          try
          {
            FEncoding = NULL;
            LoadFromFile(false);
            TEditorConfiguration EditorConfiguration = WinConfiguration->Editor;
            if (EditorConfiguration.WarnOnEncodingFallback)
            {
              // by now the FEncodingName is the secondary encoding
              Message = Message + L" " + FMTLOAD(EDITOR_ENCODING_REVERTED, (FEncodingName));
              TMessageParams Params(mpNeverAskAgainCheck);
              unsigned int Answer =
                MessageDialog(MainInstructions(Message), qtInformation, qaOK, HELP_NONE, &Params);
              if (Answer == qaNeverAskAgain)
              {
                EditorConfiguration.WarnOnEncodingFallback = false;
                WinConfiguration->Editor = EditorConfiguration;
              }
            }
          }
          catch(...)
          {
            // restored values are never used anyway, as this can get here only
            // when opening editor and this is fatal error preventing the editor from opening
            FEncoding = EncodingBackup;
            FEncodingName = EncodingNameBackup;
            throw Exception(Message);
          }
        }
        else
        {
          throw Exception(Message);
        }
      }
      else
      {
        throw Exception(MainInstructions(FMTLOAD(EDITOR_LOAD_ERROR, (FFileName))));
      }
    }
  }
  __finally
  {
    delete Stream;
  }

  SendMessage(EditorMemo->Handle, EM_EXLIMITTEXT, 0, 0x7FFFFFF0);
}