From: s_kawamoto Date: Sun, 1 Jul 2012 13:07:27 +0000 (+0900) Subject: Fix bugs of corruption during conversion from Shift_JIS to UTF-8. X-Git-Url: http://git.osdn.net/view?p=ffftp%2Fffftp.git;a=commitdiff_plain;h=aa3eb353c0bf24065b8a44e7238cdcf72c814d6f Fix bugs of corruption during conversion from Shift_JIS to UTF-8. --- diff --git a/FFFTP_Eng_Release/FFFTP.exe b/FFFTP_Eng_Release/FFFTP.exe index 54141c2..e6417d9 100644 Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ diff --git a/Release/FFFTP.exe b/Release/FFFTP.exe index ce0d191..904a56c 100644 Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ diff --git a/codecnv.c b/codecnv.c index a313d1a..f9a9e37 100644 --- a/codecnv.c +++ b/codecnv.c @@ -1517,20 +1517,18 @@ int ConvUTF8NtoSJIS_TruncateToDelimiter(char* pUTF8, int UTF8Length, int* pNewUT { UTF8Length--; UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length); - SJISLength = NewSJISLength; NewSJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL); } free(pUTF16); // UTF-16 LE変換した時に文字数が増減する位置がUTF-8の区切り - NewUTF16Length = UTF16Length; - while(UTF8Length > 0 && NewUTF16Length >= UTF16Length) - { - UTF8Length--; - UTF16Length = NewUTF16Length; - NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0); - } if(pNewUTF8Length) { + NewUTF16Length = UTF16Length; + while(UTF8Length > 0 && NewUTF16Length >= UTF16Length) + { + UTF8Length--; + NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0); + } if(UTF16Length > 0) UTF8Length++; *pNewUTF8Length = UTF8Length; @@ -1582,7 +1580,6 @@ int ConvUTF8NtoSJIS(CODECONVINFO *cInfo) SrcLength = SrcLength / 2; } } - // UTF-8の場合、不完全な文字は常に変換されない UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0); // サイズ0 or バッファサイズより大きい場合は diff --git a/config.h b/config.h index c6365fa..fd266f2 100644 --- a/config.h +++ b/config.h @@ -3,12 +3,6 @@ #define HAVE_OPENVMS // 全体に影響する設定はここに記述する予定 -// 内部をUTF-8として扱いマルチバイト文字ワイド文字APIラッパーを使用する -#include "mbswrapper.h" -// OpenSSL用ソケットラッパーを使用する -#include "socketwrapper.h" -// プロセスをDLL Injectionから保護する -#include "protectprocess.h" // 使用するCPUを1個に限定する(マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策) //#define DISABLE_MULTI_CPUS // ファイル転送用のネットワークバッファを無効にする(通信中止後にリモートのディレクトリが表示されないバグ対策) @@ -27,3 +21,10 @@ /* HP NonStop Server 用のコードを有効にする */ #define HAVE_TANDEM +// 内部をUTF-8として扱いマルチバイト文字ワイド文字APIラッパーを使用する +#include "mbswrapper.h" +// OpenSSL用ソケットラッパーを使用する +#include "socketwrapper.h" +// プロセスをDLL Injectionから保護する +#include "protectprocess.h" + diff --git a/mbswrapper.c b/mbswrapper.c index 4bc022c..fa04fee 100644 --- a/mbswrapper.c +++ b/mbswrapper.c @@ -715,6 +715,7 @@ int MultiByteToWideCharAlternative(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiB LPCSTR pMultiLimit; LPWSTR pWideLimit; DWORD Code; + int TempCount; WCHAR Temp[8]; if(CodePage != CP_UTF8 || dwFlags != 0) return MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar); @@ -731,8 +732,9 @@ int MultiByteToWideCharAlternative(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiB continue; if(lpWideCharStr) { - WideCount += PutNextCharW(lpWideCharStr, pWideLimit, &lpWideCharStr, Code); - if(lpWideCharStr >= pWideLimit) + TempCount = PutNextCharW(lpWideCharStr, pWideLimit, &lpWideCharStr, Code); + WideCount += TempCount; + if(TempCount == 0 && lpWideCharStr >= pWideLimit) { WideCount = 0; break; @@ -752,6 +754,7 @@ int WideCharToMultiByteAlternative(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideC LPCWSTR pWideLimit; LPSTR pMultiLimit; DWORD Code; + int TempCount; CHAR Temp[8]; if(CodePage != CP_UTF8 || dwFlags != 0) return WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar); @@ -768,8 +771,9 @@ int WideCharToMultiByteAlternative(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideC continue; if(lpMultiByteStr) { - MultiCount += PutNextCharM(lpMultiByteStr, pMultiLimit, &lpMultiByteStr, Code); - if(lpMultiByteStr >= pMultiLimit) + TempCount = PutNextCharM(lpMultiByteStr, pMultiLimit, &lpMultiByteStr, Code); + MultiCount += TempCount; + if(TempCount == 0 && lpMultiByteStr >= pMultiLimit) { MultiCount = 0; break;