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 }
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 }
//--------------------------------------------------------------------------- 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); }