OSDN Git Service

Fix bugs of text encoding routines.
[ffftp/ffftp.git] / codecnv.c
index 006e843..13d6b91 100644 (file)
--- a/codecnv.c
+++ b/codecnv.c
@@ -366,6 +366,8 @@ void InitCodeConvInfo(CODECONVINFO *cInfo)
        cInfo->KanjiFst = 0;\r
        cInfo->KanaPrev = 0;\r
        cInfo->KanaProc = NULL;\r
+       // UTF-8\91Î\89\9e\r
+       cInfo->EscUTF8Len = 0;\r
        return;\r
 }\r
 \r
@@ -397,6 +399,9 @@ int FlushRestData(CODECONVINFO *cInfo)
                *Put++ = cInfo->EscCode[0];\r
        if(cInfo->EscProc == 2)\r
                *Put++ = cInfo->EscCode[1];\r
+       // UTF-8\91Î\89\9e\r
+       memcpy(Put, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);\r
+       Put += cInfo->EscUTF8Len;\r
 \r
        cInfo->OutLen = Put - cInfo->Buf;\r
 \r
@@ -1478,75 +1483,133 @@ int ConvUTF8NtoSJIS(CODECONVINFO *cInfo)
 {\r
        int Continue;\r
 \r
-       char temp_string[2048];\r
+//     char temp_string[2048];\r
        int string_length;\r
 \r
+       // \91å\82«\82¢\83T\83C\83Y\82É\91Î\89\9e\r
+       // \8fI\92[\82ÌNULL\82ð\8aÜ\82Þ\83o\83O\82ð\8fC\90³\r
+       int SrcLength;\r
+       char* pSrc;\r
+       wchar_t* pUTF16;\r
+       int UTF16Length;\r
+       int Count;\r
+\r
        Continue = NO;\r
 \r
        // \90\90¬\82³\82ê\82é\92\86\8aÔ\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
-       string_length = MultiByteToWideChar(\r
-                                               CP_UTF8,                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-                                               0,                              // \83t\83\89\83O(0:\82È\82µ)\r
-                                               cInfo->Str,             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-                                               -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-                                               NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-                                               0                               // \8ai\94[\90æ\83T\83C\83Y\r
-                                       );\r
+//     string_length = MultiByteToWideChar(\r
+//                                             CP_UTF8,                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
+//                                             0,                              // \83t\83\89\83O(0:\82È\82µ)\r
+//                                             cInfo->Str,             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
+//                                             -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
+//                                             NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
+//                                             0                               // \8ai\94[\90æ\83T\83C\83Y\r
+//                                     );\r
+       // \91O\89ñ\82Ì\95Ï\8a·\95s\94\\82È\8ec\82è\82Ì\95\8e\9a\97ñ\82ð\93ü\97Í\82Ì\90æ\93ª\82É\8c\8b\8d\87\r
+       SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;\r
+       if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))\r
+       {\r
+               *(cInfo->Buf) = '\0';\r
+               cInfo->BufSize = 0;\r
+               return Continue;\r
+       }\r
+       memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);\r
+       memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);\r
+       *(pSrc + SrcLength) = '\0';\r
+       // UTF-8\82Ì\8fê\8d\87\81A\95s\8a®\91S\82È\95\8e\9a\82Í\8fí\82É\95Ï\8a·\82³\82ê\82È\82¢\r
+       UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0);\r
 \r
        // \83T\83C\83Y0 or \83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\r
        // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
        // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
-       if( string_length == 0 ||\r
-               string_length >= 1024 ){\r
+//     if( string_length == 0 ||\r
+//             string_length >= 1024 ){\r
+//             *(cInfo->Buf) = '\0';\r
+//             cInfo->BufSize = 0;\r
+//             return(Continue);\r
+//     }\r
+       if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))\r
+       {\r
+               free(pSrc);\r
                *(cInfo->Buf) = '\0';\r
                cInfo->BufSize = 0;\r
-               return(Continue);\r
+               return Continue;\r
        }\r
 \r
        // \92\86\8aÔ\83R\81[\83h(unicode)\82É\95Ï\8a·\r
-       MultiByteToWideChar(\r
-               CP_UTF8,                                                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-               0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
-               cInfo->Str,                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-               -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-               (unsigned short *)temp_string,  // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-               1024                                                    // \8ai\94[\90æ\83T\83C\83Y\r
-       );\r
+//     MultiByteToWideChar(\r
+//             CP_UTF8,                                                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
+//             0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
+//             cInfo->Str,                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
+//             -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
+//             (unsigned short *)temp_string,  // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
+//             1024                                                    // \8ai\94[\90æ\83T\83C\83Y\r
+//     );\r
+       MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, pUTF16, UTF16Length);\r
 \r
        // \90\90¬\82³\82ê\82éUTF-8\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
-       string_length = WideCharToMultiByte(\r
-                                               CP_ACP,                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-                                               0,                              // \83t\83\89\83O(0:\82È\82µ)\r
-                                               (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-                                               -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-                                               NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-                                               0,                              // \8ai\94[\90æ\83T\83C\83Y\r
-                                               NULL,NULL\r
-                                       );\r
+//     string_length = WideCharToMultiByte(\r
+//                                             CP_ACP,                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
+//                                             0,                              // \83t\83\89\83O(0:\82È\82µ)\r
+//                                             (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
+//                                             -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
+//                                             NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
+//                                             0,                              // \8ai\94[\90æ\83T\83C\83Y\r
+//                                             NULL,NULL\r
+//                                     );\r
+       string_length = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
 \r
        // \83T\83C\83Y0 or \8fo\97Í\83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
        // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
        // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
-       if( string_length == 0 ||\r
-               string_length >= cInfo->BufSize ){\r
-               *(cInfo->Buf) = '\0';\r
-               cInfo->BufSize = 0;\r
-               return(Continue);\r
-       }\r
+//     if( string_length == 0 ||\r
+//             string_length >= cInfo->BufSize ){\r
+//             *(cInfo->Buf) = '\0';\r
+//             cInfo->BufSize = 0;\r
+//             return(Continue);\r
+//     }\r
 \r
        // \8fo\97Í\83T\83C\83Y\82ð\90Ý\92è\r
-       cInfo->OutLen = string_length;\r
+//     cInfo->OutLen = string_length;\r
 \r
        // UTF-8\83R\81[\83h\82É\95Ï\8a·\r
-       WideCharToMultiByte(\r
-               CP_ACP,                                                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-               0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
-               (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-               -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-               cInfo->Buf,                                             // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ(BOM:3bytes)\r
-               cInfo->BufSize,                                 // \8ai\94[\90æ\83T\83C\83Y\r
-               NULL,NULL\r
-       );\r
+//     WideCharToMultiByte(\r
+//             CP_ACP,                                                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
+//             0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
+//             (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
+//             -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
+//             cInfo->Buf,                                             // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ(BOM:3bytes)\r
+//             cInfo->BufSize,                                 // \8ai\94[\90æ\83T\83C\83Y\r
+//             NULL,NULL\r
+//     );\r
+       cInfo->OutLen = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);\r
+       // \83o\83b\83t\83@\82É\8eû\82Ü\82ç\82È\82¢\82½\82ß\95Ï\8a·\95\8e\9a\90\94\82ð\94¼\8c¸\r
+       while(cInfo->OutLen == 0 && UTF16Length > 0)\r
+       {\r
+               UTF16Length = UTF16Length / 2;\r
+               cInfo->OutLen = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);\r
+       }\r
+       // \95Ï\8a·\82³\82ê\82½\8c³\82Ì\95\8e\9a\97ñ\82Å\82Ì\95\8e\9a\90\94\82ð\8eæ\93¾\r
+       Count = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
+       // \95Ï\8a·\89Â\94\\82È\8ec\82è\82Ì\95\8e\9a\90\94\82ð\8eæ\93¾\r
+       UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc + Count, SrcLength - Count, NULL, 0);\r
+       cInfo->Str += Count - cInfo->EscUTF8Len;\r
+       cInfo->StrLen -= Count - cInfo->EscUTF8Len;\r
+       cInfo->EscUTF8Len = 0;\r
+       if(UTF16Length > 0)\r
+               Continue = YES;\r
+       else\r
+       {\r
+               // \95Ï\8a·\95s\94\\82È\82½\82ß\8e\9f\82Ì\93ü\97Í\82Ì\90æ\93ª\82É\8c\8b\8d\87\r
+               memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);\r
+               cInfo->EscUTF8Len = cInfo->StrLen;\r
+               cInfo->Str += cInfo->StrLen;\r
+               cInfo->StrLen = 0;\r
+               Continue = NO;\r
+       }\r
+\r
+       free(pSrc);\r
+       free(pUTF16);\r
 \r
        return(Continue);\r
 }\r
@@ -1566,64 +1629,112 @@ int ConvSJIStoUTF8N(CODECONVINFO *cInfo)
 {\r
        int Continue;\r
 \r
-       char temp_string[2048];\r
+//     char temp_string[2048];\r
        int string_length;\r
 \r
+       // \91å\82«\82¢\83T\83C\83Y\82É\91Î\89\9e\r
+       // \8fI\92[\82ÌNULL\82ð\8aÜ\82Þ\83o\83O\82ð\8fC\90³\r
+       int SrcLength;\r
+       char* pSrc;\r
+       wchar_t* pUTF16;\r
+       int UTF16Length;\r
+       int Count;\r
+\r
        Continue = NO;\r
 \r
        // \90\90¬\82³\82ê\82é\92\86\8aÔ\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
-       string_length = MultiByteToWideChar(\r
-                                               CP_ACP,                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-                                               0,                              // \83t\83\89\83O(0:\82È\82µ)\r
-                                               cInfo->Str,             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-                                               -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-                                               NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-                                               0                               // \8ai\94[\90æ\83T\83C\83Y\r
-                                       );\r
+//     string_length = MultiByteToWideChar(\r
+//                                             CP_ACP,                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
+//                                             0,                              // \83t\83\89\83O(0:\82È\82µ)\r
+//                                             cInfo->Str,             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
+//                                             -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
+//                                             NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
+//                                             0                               // \8ai\94[\90æ\83T\83C\83Y\r
+//                                     );\r
+       // \91O\89ñ\82Ì\95Ï\8a·\95s\94\\82È\8ec\82è\82Ì\95\8e\9a\97ñ\82ð\93ü\97Í\82Ì\90æ\93ª\82É\8c\8b\8d\87\r
+       SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;\r
+       if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))\r
+       {\r
+               *(cInfo->Buf) = '\0';\r
+               cInfo->BufSize = 0;\r
+               return Continue;\r
+       }\r
+       memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);\r
+       memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);\r
+       *(pSrc + SrcLength) = '\0';\r
+       // Shift_JIS\82Ì\8fê\8d\87\81A\95s\8a®\91S\82È\95\8e\9a\82Å\82à\95Ï\8a·\82³\82ê\82é\82±\82Æ\82ª\82 \82é\82½\82ß\81A\96\96\94ö\82Ì\95s\8a®\91S\82È\95\94\95ª\82ð\8dí\82é\r
+       Count = 0;\r
+       while(Count < SrcLength)\r
+       {\r
+               if(((unsigned char)*(pSrc + Count) >= 0x81 && (unsigned char)*(pSrc + Count) <= 0x9f) || (unsigned char)*(pSrc + Count) >= 0xe0)\r
+               {\r
+                       if((unsigned char)*(pSrc + Count + 1) >= 0x40)\r
+                               Count += 2;\r
+                       else\r
+                       {\r
+                               if(Count + 2 > SrcLength)\r
+                                       break;\r
+                               Count += 1;\r
+                       }\r
+               }\r
+               else\r
+                       Count += 1;\r
+       }\r
+       SrcLength = Count;\r
+       UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, NULL, 0);\r
 \r
        // \83T\83C\83Y0 or \83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
        // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
        // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
-       if( string_length == 0 ||\r
-               string_length >= 1024 ){\r
+//     if( string_length == 0 ||\r
+//             string_length >= 1024 ){\r
+//             *(cInfo->Buf) = '\0';\r
+//             cInfo->BufSize = 0;\r
+//             return(Continue);\r
+//     }\r
+       if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))\r
+       {\r
+               free(pSrc);\r
                *(cInfo->Buf) = '\0';\r
                cInfo->BufSize = 0;\r
-               return(Continue);\r
+               return Continue;\r
        }\r
 \r
        // \92\86\8aÔ\83R\81[\83h(unicode)\82É\95Ï\8a·\r
-       MultiByteToWideChar(\r
-               CP_ACP,                                                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-               0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
-               cInfo->Str,                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-               -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-               (unsigned short *)temp_string,  // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-               1024                                                    // \8ai\94[\90æ\83T\83C\83Y\r
-       );\r
+//     MultiByteToWideChar(\r
+//             CP_ACP,                                                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
+//             0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
+//             cInfo->Str,                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
+//             -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
+//             (unsigned short *)temp_string,  // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
+//             1024                                                    // \8ai\94[\90æ\83T\83C\83Y\r
+//     );\r
+       MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, pUTF16, UTF16Length);\r
 \r
        // \90\90¬\82³\82ê\82éUTF-8\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
-       string_length = WideCharToMultiByte(\r
-                                               CP_UTF8,                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-                                               0,                              // \83t\83\89\83O(0:\82È\82µ)\r
-                                               (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-                                               -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-                                               NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-                                               0,                              // \8ai\94[\90æ\83T\83C\83Y\r
-                                               NULL,NULL\r
-                                       );\r
+//     string_length = WideCharToMultiByte(\r
+//                                             CP_UTF8,                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
+//                                             0,                              // \83t\83\89\83O(0:\82È\82µ)\r
+//                                             (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
+//                                             -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
+//                                             NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
+//                                             0,                              // \8ai\94[\90æ\83T\83C\83Y\r
+//                                             NULL,NULL\r
+//                                     );\r
+       string_length = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
 \r
        // \83T\83C\83Y0 or \8fo\97Í\83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
        // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
        // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
-       if( string_length == 0 ||\r
-               string_length >= cInfo->BufSize ){\r
-               *(cInfo->Buf) = '\0';\r
-               cInfo->BufSize = 0;\r
-               return(Continue);\r
-       }\r
+//     if( string_length == 0 ||\r
+//             string_length >= cInfo->BufSize ){\r
+//             *(cInfo->Buf) = '\0';\r
+//             cInfo->BufSize = 0;\r
+//             return(Continue);\r
+//     }\r
 \r
        // \8fo\97Í\83T\83C\83Y\82ð\90Ý\92è\r
-       cInfo->OutLen = string_length;\r
+//     cInfo->OutLen = string_length;\r
 \r
        /*\r
        // \81«\95t\82¯\82¿\82á\82¾\82ß \83R\83}\83\93\83h\82É\82à\92Ç\89Á\82³\82ê\82Ä\82µ\82Ü\82¤\r
@@ -1634,15 +1745,43 @@ int ConvSJIStoUTF8N(CODECONVINFO *cInfo)
        */\r
 \r
        // UTF-8\83R\81[\83h\82É\95Ï\8a·\r
-       WideCharToMultiByte(\r
-               CP_UTF8,                                                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-               0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
-               (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-               -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-               cInfo->Buf,                                     // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ(BOM:3bytes)\r
-               cInfo->BufSize,                                 // \8ai\94[\90æ\83T\83C\83Y\r
-               NULL,NULL\r
-       );\r
+//     WideCharToMultiByte(\r
+//             CP_UTF8,                                                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
+//             0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
+//             (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
+//             -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
+//             cInfo->Buf,                                     // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ(BOM:3bytes)\r
+//             cInfo->BufSize,                                 // \8ai\94[\90æ\83T\83C\83Y\r
+//             NULL,NULL\r
+//     );\r
+       cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);\r
+       // \83o\83b\83t\83@\82É\8eû\82Ü\82ç\82È\82¢\82½\82ß\95Ï\8a·\95\8e\9a\90\94\82ð\94¼\8c¸\r
+       while(cInfo->OutLen == 0 && UTF16Length > 0)\r
+       {\r
+               UTF16Length = UTF16Length / 2;\r
+               cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);\r
+       }\r
+       // \95Ï\8a·\82³\82ê\82½\8c³\82Ì\95\8e\9a\97ñ\82Å\82Ì\95\8e\9a\90\94\82ð\8eæ\93¾\r
+       Count = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
+       // \95Ï\8a·\89Â\94\\82È\8ec\82è\82Ì\95\8e\9a\90\94\82ð\8eæ\93¾\r
+       UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc + Count, SrcLength - Count, NULL, 0);\r
+       cInfo->Str += Count - cInfo->EscUTF8Len;\r
+       cInfo->StrLen -= Count - cInfo->EscUTF8Len;\r
+       cInfo->EscUTF8Len = 0;\r
+       if(UTF16Length > 0)\r
+               Continue = YES;\r
+       else\r
+       {\r
+               // \95Ï\8a·\95s\94\\82È\82½\82ß\8e\9f\82Ì\93ü\97Í\82Ì\90æ\93ª\82É\8c\8b\8d\87\r
+               memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);\r
+               cInfo->EscUTF8Len = cInfo->StrLen;\r
+               cInfo->Str += cInfo->StrLen;\r
+               cInfo->StrLen = 0;\r
+               Continue = NO;\r
+       }\r
+\r
+       free(pSrc);\r
+       free(pUTF16);\r
 \r
        return(Continue);\r
 }\r