Loweynet
Révision | aa3eb353c0bf24065b8a44e7238cdcf72c814d6f (tree) |
---|---|
l'heure | 2012-07-01 22:07:27 |
Auteur | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of corruption during conversion from Shift_JIS to UTF-8.
@@ -1517,20 +1517,18 @@ int ConvUTF8NtoSJIS_TruncateToDelimiter(char* pUTF8, int UTF8Length, int* pNewUT | ||
1517 | 1517 | { |
1518 | 1518 | UTF8Length--; |
1519 | 1519 | UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length); |
1520 | - SJISLength = NewSJISLength; | |
1521 | 1520 | NewSJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL); |
1522 | 1521 | } |
1523 | 1522 | free(pUTF16); |
1524 | 1523 | // UTF-16 LE変換した時に文字数が増減する位置がUTF-8の区切り |
1525 | - NewUTF16Length = UTF16Length; | |
1526 | - while(UTF8Length > 0 && NewUTF16Length >= UTF16Length) | |
1527 | - { | |
1528 | - UTF8Length--; | |
1529 | - UTF16Length = NewUTF16Length; | |
1530 | - NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0); | |
1531 | - } | |
1532 | 1524 | if(pNewUTF8Length) |
1533 | 1525 | { |
1526 | + NewUTF16Length = UTF16Length; | |
1527 | + while(UTF8Length > 0 && NewUTF16Length >= UTF16Length) | |
1528 | + { | |
1529 | + UTF8Length--; | |
1530 | + NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0); | |
1531 | + } | |
1534 | 1532 | if(UTF16Length > 0) |
1535 | 1533 | UTF8Length++; |
1536 | 1534 | *pNewUTF8Length = UTF8Length; |
@@ -1582,7 +1580,6 @@ int ConvUTF8NtoSJIS(CODECONVINFO *cInfo) | ||
1582 | 1580 | SrcLength = SrcLength / 2; |
1583 | 1581 | } |
1584 | 1582 | } |
1585 | - // UTF-8の場合、不完全な文字は常に変換されない | |
1586 | 1583 | UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0); |
1587 | 1584 | |
1588 | 1585 | // サイズ0 or バッファサイズより大きい場合は |
@@ -3,12 +3,6 @@ | ||
3 | 3 | #define HAVE_OPENVMS |
4 | 4 | |
5 | 5 | // 全体に影響する設定はここに記述する予定 |
6 | -// 内部をUTF-8として扱いマルチバイト文字ワイド文字APIラッパーを使用する | |
7 | -#include "mbswrapper.h" | |
8 | -// OpenSSL用ソケットラッパーを使用する | |
9 | -#include "socketwrapper.h" | |
10 | -// プロセスをDLL Injectionから保護する | |
11 | -#include "protectprocess.h" | |
12 | 6 | // 使用するCPUを1個に限定する(マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策) |
13 | 7 | //#define DISABLE_MULTI_CPUS |
14 | 8 | // ファイル転送用のネットワークバッファを無効にする(通信中止後にリモートのディレクトリが表示されないバグ対策) |
@@ -27,3 +21,10 @@ | ||
27 | 21 | /* HP NonStop Server 用のコードを有効にする */ |
28 | 22 | #define HAVE_TANDEM |
29 | 23 | |
24 | +// 内部をUTF-8として扱いマルチバイト文字ワイド文字APIラッパーを使用する | |
25 | +#include "mbswrapper.h" | |
26 | +// OpenSSL用ソケットラッパーを使用する | |
27 | +#include "socketwrapper.h" | |
28 | +// プロセスをDLL Injectionから保護する | |
29 | +#include "protectprocess.h" | |
30 | + |
@@ -715,6 +715,7 @@ int MultiByteToWideCharAlternative(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiB | ||
715 | 715 | LPCSTR pMultiLimit; |
716 | 716 | LPWSTR pWideLimit; |
717 | 717 | DWORD Code; |
718 | + int TempCount; | |
718 | 719 | WCHAR Temp[8]; |
719 | 720 | if(CodePage != CP_UTF8 || dwFlags != 0) |
720 | 721 | return MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar); |
@@ -731,8 +732,9 @@ int MultiByteToWideCharAlternative(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiB | ||
731 | 732 | continue; |
732 | 733 | if(lpWideCharStr) |
733 | 734 | { |
734 | - WideCount += PutNextCharW(lpWideCharStr, pWideLimit, &lpWideCharStr, Code); | |
735 | - if(lpWideCharStr >= pWideLimit) | |
735 | + TempCount = PutNextCharW(lpWideCharStr, pWideLimit, &lpWideCharStr, Code); | |
736 | + WideCount += TempCount; | |
737 | + if(TempCount == 0 && lpWideCharStr >= pWideLimit) | |
736 | 738 | { |
737 | 739 | WideCount = 0; |
738 | 740 | break; |
@@ -752,6 +754,7 @@ int WideCharToMultiByteAlternative(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideC | ||
752 | 754 | LPCWSTR pWideLimit; |
753 | 755 | LPSTR pMultiLimit; |
754 | 756 | DWORD Code; |
757 | + int TempCount; | |
755 | 758 | CHAR Temp[8]; |
756 | 759 | if(CodePage != CP_UTF8 || dwFlags != 0) |
757 | 760 | return WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar); |
@@ -768,8 +771,9 @@ int WideCharToMultiByteAlternative(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideC | ||
768 | 771 | continue; |
769 | 772 | if(lpMultiByteStr) |
770 | 773 | { |
771 | - MultiCount += PutNextCharM(lpMultiByteStr, pMultiLimit, &lpMultiByteStr, Code); | |
772 | - if(lpMultiByteStr >= pMultiLimit) | |
774 | + TempCount = PutNextCharM(lpMultiByteStr, pMultiLimit, &lpMultiByteStr, Code); | |
775 | + MultiCount += TempCount; | |
776 | + if(TempCount == 0 && lpMultiByteStr >= pMultiLimit) | |
773 | 777 | { |
774 | 778 | MultiCount = 0; |
775 | 779 | break; |