1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\r
12 / 1. Redistributions of source code must retain the above copyright
\r
13 / notice, this list of conditions and the following disclaimer.
\r
14 / 2. Redistributions in binary form must reproduce the above copyright
\r
15 / notice, this list of conditions and the following disclaimer in the
\r
16 / documentation and/or other materials provided with the distribution.
\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
\r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
\r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
\r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
\r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
\r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
28 /============================================================================*/
\r
35 //#include <winsock.h>
\r
36 #include <winsock2.h>
\r
37 #include <mbstring.h>
\r
38 #include <windowsx.h>
\r
41 #include "resource.h"
\r
45 #define CONV_ASCII 0 /* ASCII文字処理中 */
\r
46 #define CONV_KANJI 1 /* 漢字処理中 */
\r
47 #define CONV_KANA 2 /* 半角カタカナ処理中 */
\r
50 /*===== プロトタイプ =====*/
\r
52 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
53 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
54 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
55 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
56 static int HanKataToZen(char Ch);
\r
57 static int AskDakuon(char Ch, char Daku);
\r
59 static int CheckOnSJIS(uchar *Pos, uchar *Btm);
\r
60 static int CheckOnEUC(uchar *Pos, uchar *Btm);
\r
61 static int ConvertIBMExtendedChar(int code);
\r
66 /*----- 漢字コード変換のテストプログラム ------------------------------------*/
\r
68 void CodeCnvTest(void)
\r
71 #define BUFBUF2 BUFBUF+3
\r
81 // DoPrintf("---START ZEN");
\r
83 Strm1 = fopen("in.txt", "rb");
\r
84 Strm2 = fopen("out_zen.txt", "wb");
\r
86 InitCodeConvInfo(&cInfo);
\r
87 cInfo.KanaCnv = YES;
\r
90 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
93 cInfo.StrLen = Byte;
\r
95 cInfo.BufSize = BUFBUF2;
\r
97 // DoPrintf("READ %d", Byte);
\r
101 // Continue = ConvEUCtoSJIS(&cInfo);
\r
102 // Continue = ConvJIStoSJIS(&cInfo);
\r
103 // Continue = ConvSJIStoEUC(&cInfo);
\r
104 // Continue = ConvSJIStoJIS(&cInfo);
\r
105 Continue = ConvSMBtoSJIS(&cInfo);
\r
106 // Continue = ConvSJIStoSMB_HEX(&cInfo);
\r
107 // Continue = ConvSJIStoSMB_CAP(&cInfo);
\r
109 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
110 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
113 while(Continue == YES);
\r
117 cInfo.BufSize = BUFBUF2;
\r
118 FlushRestData(&cInfo);
\r
119 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
120 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
127 // DoPrintf("---START HAN");
\r
129 Strm1 = fopen("in.txt", "rb");
\r
130 Strm2 = fopen("out_han.txt", "wb");
\r
132 InitCodeConvInfo(&cInfo);
\r
133 cInfo.KanaCnv = NO;
\r
136 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
139 cInfo.StrLen = Byte;
\r
141 cInfo.BufSize = BUFBUF2;
\r
143 // DoPrintf("READ %d", Byte);
\r
147 // Continue = ConvEUCtoSJIS(&cInfo);
\r
148 // Continue = ConvJIStoSJIS(&cInfo);
\r
149 // Continue = ConvSJIStoEUC(&cInfo);
\r
150 // Continue = ConvSJIStoJIS(&cInfo);
\r
151 Continue = ConvSMBtoSJIS(&cInfo);
\r
152 // Continue = ConvSJIStoSMB_HEX(&cInfo);
\r
153 // Continue = ConvSJIStoSMB_CAP(&cInfo);
\r
154 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
155 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
158 while(Continue == YES);
\r
162 cInfo.BufSize = BUFBUF2;
\r
163 FlushRestData(&cInfo);
\r
164 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
165 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
170 // DoPrintf("---END");
\r
179 /*----- 改行コード変換のテストプログラム ------------------------------------*/
\r
181 void TermCodeCnvTest(void)
\r
184 #define BUFBUF2 BUFBUF
\r
186 TERMCODECONVINFO cInfo;
\r
188 char Buf2[BUFBUF2];
\r
194 // DoPrintf("---START");
\r
196 Strm1 = fopen("in.txt", "rb");
\r
197 Strm2 = fopen("out.txt", "wb");
\r
199 InitTermCodeConvInfo(&cInfo);
\r
201 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
204 cInfo.StrLen = Byte;
\r
206 cInfo.BufSize = BUFBUF2;
\r
208 // DoPrintf("READ %d", Byte);
\r
212 Continue = ConvTermCodeToCRLF(&cInfo);
\r
214 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
215 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
218 while(Continue == YES);
\r
222 cInfo.BufSize = BUFBUF2;
\r
223 FlushRestTermCodeConvData(&cInfo);
\r
224 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
225 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
230 // DoPrintf("---END");
\r
247 /*----- 改行コード変換情報を初期化 --------------------------------------------
\r
250 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
254 *----------------------------------------------------------------------------*/
\r
256 void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo)
\r
263 /*----- 改行コード変換の残り情報を出力 ----------------------------------------
\r
266 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
269 * int くり返しフラグ (=NO)
\r
273 *----------------------------------------------------------------------------*/
\r
275 int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo)
\r
281 if(cInfo->Term == 0x0D)
\r
284 cInfo->OutLen = Put - cInfo->Buf;
\r
290 /*----- 改行コードをCRLFに変換 -------------------------------------------------
\r
293 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
296 * int くり返しフラグ (YES/NO)
\r
299 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
300 *----------------------------------------------------------------------------*/
\r
302 int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo)
\r
312 Limit = cInfo->Buf + cInfo->BufSize - 1;
\r
314 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
324 if(cInfo->Term == 0x0D)
\r
327 cInfo->Term = *Str++;
\r
333 if(cInfo->Term != 0x0D)
\r
338 if(cInfo->Term == 0x0D)
\r
347 cInfo->OutLen = Put - cInfo->Buf;
\r
353 /*----- 漢字コード変換情報を初期化 --------------------------------------------
\r
356 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
360 *----------------------------------------------------------------------------*/
\r
362 void InitCodeConvInfo(CODECONVINFO *cInfo)
\r
364 cInfo->KanaCnv = YES;
\r
366 cInfo->EscProc = 0;
\r
367 cInfo->KanjiMode = CONV_ASCII;
\r
368 cInfo->KanjiFst = 0;
\r
369 cInfo->KanaPrev = 0;
\r
370 cInfo->KanaProc = NULL;
\r
372 cInfo->EscUTF8Len = 0;
\r
373 cInfo->EscFlush = NO;
\r
374 cInfo->FlushProc = NULL;
\r
379 /*----- 漢字コード変換の残り情報を出力 ----------------------------------------
\r
382 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
385 * int くり返しフラグ (=NO)
\r
389 *----------------------------------------------------------------------------*/
\r
391 int FlushRestData(CODECONVINFO *cInfo)
\r
396 if(cInfo->FlushProc != NULL)
\r
398 cInfo->EscFlush = YES;
\r
399 return cInfo->FlushProc(cInfo);
\r
404 if(cInfo->KanaProc != NULL)
\r
405 Put = (cInfo->KanaProc)(cInfo, 0, Put);
\r
407 if(cInfo->KanjiFst != 0)
\r
408 *Put++ = cInfo->KanjiFst;
\r
409 if(cInfo->EscProc >= 1)
\r
410 *Put++ = cInfo->EscCode[0];
\r
411 if(cInfo->EscProc == 2)
\r
412 *Put++ = cInfo->EscCode[1];
\r
414 cInfo->OutLen = Put - cInfo->Buf;
\r
420 /*----- EUC漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
423 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
426 * int くり返しフラグ (YES/NO)
\r
429 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
430 *----------------------------------------------------------------------------*/
\r
432 int ConvEUCtoSJIS(CODECONVINFO *cInfo)
\r
440 cInfo->KanaProc = &ConvEUCtoSJISkanaProc;
\r
445 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
447 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
455 if((*Str & 0x80) != 0)
\r
457 if(cInfo->KanjiFst == 0)
\r
458 cInfo->KanjiFst = *Str++;
\r
461 if((uchar)cInfo->KanjiFst == (uchar)0x8E) /* 半角カタカナ */
\r
463 Put = ConvEUCtoSJISkanaProc(cInfo, *Str++, Put);
\r
467 Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put);
\r
469 Kcode = _mbcjistojms(((cInfo->KanjiFst & 0x7F) * 0x100) + (*Str++ & 0x7F));
\r
470 *Put++ = HIGH8(Kcode);
\r
471 *Put++ = LOW8(Kcode);
\r
473 cInfo->KanjiFst = 0;
\r
478 Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put);
\r
480 if(cInfo->KanjiFst != 0)
\r
482 *Put++ = cInfo->KanjiFst;
\r
483 cInfo->KanjiFst = 0;
\r
490 cInfo->OutLen = Put - cInfo->Buf;
\r
496 /*----- EUC-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
499 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
501 * char *Put : データセット位置
\r
505 *----------------------------------------------------------------------------*/
\r
507 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
512 if(cInfo->KanaCnv == NO)
\r
519 if(cInfo->KanaPrev != 0)
\r
521 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
523 Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku;
\r
524 *Put++ = HIGH8(Kcode);
\r
525 *Put++ = LOW8(Kcode);
\r
528 cInfo->KanaPrev = Dt;
\r
530 cInfo->KanaPrev = 0;
\r
533 cInfo->KanaPrev = Dt;
\r
539 /*----- JIS漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
542 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
545 * int くり返しフラグ (YES/NO)
\r
548 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
550 * エスケープコードは、次のものに対応している
\r
551 * 漢字開始 <ESC>$B <ESC>$@
\r
553 * 漢字終了 <ESC>(B <ESC>(J <ESC>(H
\r
554 *----------------------------------------------------------------------------*/
\r
556 int ConvJIStoSJIS(CODECONVINFO *cInfo)
\r
564 cInfo->KanaProc = &ConvJIStoSJISkanaProc;
\r
569 Limit = cInfo->Buf + cInfo->BufSize - 3;
\r
571 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
579 if(cInfo->EscProc == 0)
\r
583 if(cInfo->KanjiFst != 0)
\r
585 *Put++ = cInfo->KanjiFst;
\r
586 cInfo->KanjiFst = 0;
\r
588 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
590 cInfo->EscCode[cInfo->EscProc] = *Str++;
\r
595 if(cInfo->KanjiMode == CONV_KANA)
\r
597 if(cInfo->KanjiFst != 0)
\r
599 *Put++ = cInfo->KanjiFst;
\r
600 cInfo->KanjiFst = 0;
\r
603 if((*Str >= 0x21) && (*Str <= 0x5F))
\r
605 Put = ConvJIStoSJISkanaProc(cInfo, *Str++, Put);
\r
609 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
613 else if(cInfo->KanjiMode == CONV_KANJI)
\r
615 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
616 if((*Str >= 0x21) && (*Str <= 0x7E))
\r
618 if(cInfo->KanjiFst == 0)
\r
619 cInfo->KanjiFst = *Str++;
\r
622 Kcode = _mbcjistojms((cInfo->KanjiFst * 0x100) + *Str++);
\r
623 *Put++ = HIGH8(Kcode);
\r
624 *Put++ = LOW8(Kcode);
\r
625 cInfo->KanjiFst = 0;
\r
630 if(cInfo->KanjiFst == 0)
\r
634 *Put++ = cInfo->KanjiFst;
\r
636 cInfo->KanjiFst = 0;
\r
642 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
647 else if(cInfo->EscProc == 1)
\r
649 if((*Str == '$') || (*Str == '('))
\r
651 cInfo->EscCode[cInfo->EscProc] = *Str++;
\r
656 *Put++ = cInfo->EscCode[0];
\r
658 cInfo->EscProc = 0;
\r
661 else if(cInfo->EscProc == 2)
\r
663 if((cInfo->EscCode[1] == '$') && ((*Str == 'B') || (*Str == '@')))
\r
664 cInfo->KanjiMode = CONV_KANJI;
\r
665 else if((cInfo->EscCode[1] == '(') && (*Str == 'I'))
\r
666 cInfo->KanjiMode = CONV_KANA;
\r
667 else if((cInfo->EscCode[1] == '(') && ((*Str == 'B') || (*Str == 'J') || (*Str == 'H')))
\r
668 cInfo->KanjiMode = CONV_ASCII;
\r
671 *Put++ = cInfo->EscCode[0];
\r
672 *Put++ = cInfo->EscCode[1];
\r
673 if((cInfo->KanjiMode == CONV_KANJI) && ((*Str >= 0x21) && (*Str <= 0x7E)))
\r
674 cInfo->KanjiFst = *Str;
\r
679 cInfo->EscProc = 0;
\r
684 cInfo->OutLen = Put - cInfo->Buf;
\r
690 /*----- JIS-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
693 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
695 * char *Put : データセット位置
\r
699 *----------------------------------------------------------------------------*/
\r
701 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
706 Dt = (uchar)Dt + (uchar)0x80;
\r
707 if(cInfo->KanaCnv == NO)
\r
709 if((uchar)Dt != (uchar)0x80)
\r
714 if(cInfo->KanaPrev != 0)
\r
716 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
717 Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku;
\r
718 *Put++ = HIGH8(Kcode);
\r
719 *Put++ = LOW8(Kcode);
\r
721 if((Daku == 0) && ((uchar)Dt != (uchar)0x80))
\r
722 cInfo->KanaPrev = Dt;
\r
724 cInfo->KanaPrev = 0;
\r
726 else if((uchar)Dt != (uchar)0x80)
\r
727 cInfo->KanaPrev = Dt;
\r
733 /*----- Samba-HEX/Samba-CAP漢字コードをSHIFT-JIS漢字コードに変換 --------------
\r
736 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
739 * int くり返しフラグ (YES/NO)
\r
742 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
743 * 分割された入力文字列の変換はサポートしていない
\r
744 * 半角カタカナの変換設定には対応していない
\r
745 *----------------------------------------------------------------------------*/
\r
747 int ConvSMBtoSJIS(CODECONVINFO *cInfo)
\r
757 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
759 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
767 if((*Str == SAMBA_HEX_TAG) && (cInfo->StrLen >= 3))
\r
769 if(isxdigit(*(Str+1)) && isxdigit(*(Str+2)))
\r
771 *Put++ = N2INT(hex2bin(*(Str+1)), hex2bin(*(Str+2)));
\r
773 cInfo->StrLen -= 2;
\r
783 cInfo->OutLen = Put - cInfo->Buf;
\r
789 /*----- SHIFT-JIS漢字コードをEUC漢字コードに変換 ------------------------------
\r
792 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
795 * int くり返しフラグ (YES/NO)
\r
798 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
799 *----------------------------------------------------------------------------*/
\r
801 int ConvSJIStoEUC(CODECONVINFO *cInfo)
\r
809 cInfo->KanaProc = &ConvSJIStoEUCkanaProc;
\r
814 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
816 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
824 if(cInfo->KanjiFst == 0)
\r
826 if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
827 ((uchar)*Str >= (uchar)0xE0))
\r
829 Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put);
\r
830 cInfo->KanjiFst = *Str++;
\r
832 else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF))
\r
834 Put = ConvSJIStoEUCkanaProc(cInfo, *Str++, Put);
\r
838 Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put);
\r
844 if((uchar)*Str >= (uchar)0x40)
\r
846 Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++);
\r
847 Kcode = _mbcjmstojis(Kcode);
\r
848 *Put++ = HIGH8(Kcode) | 0x80;
\r
849 *Put++ = LOW8(Kcode) | 0x80;
\r
853 *Put++ = cInfo->KanjiFst;
\r
856 cInfo->KanjiFst = 0;
\r
861 cInfo->OutLen = Put - cInfo->Buf;
\r
867 /*----- SHIFT-JIS-->EUC漢字コードに変換の半角カタカナの処理 -------------------
\r
870 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
872 * char *Put : データセット位置
\r
876 *----------------------------------------------------------------------------*/
\r
878 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
883 if(cInfo->KanaCnv == NO)
\r
887 Kcode = 0x8E00 + (uchar)Dt;
\r
888 *Put++ = HIGH8(Kcode) | 0x80;
\r
889 *Put++ = LOW8(Kcode) | 0x80;
\r
894 if(cInfo->KanaPrev != 0)
\r
896 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
897 Kcode = HanKataToZen(cInfo->KanaPrev) + Daku;
\r
898 *Put++ = HIGH8(Kcode) | 0x80;
\r
899 *Put++ = LOW8(Kcode) | 0x80;
\r
902 cInfo->KanaPrev = Dt;
\r
904 cInfo->KanaPrev = 0;
\r
907 cInfo->KanaPrev = Dt;
\r
913 /*----- SHIFT-JIS漢字コードをJIS漢字コードに変換 ------------------------------
\r
916 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
919 * int くり返しフラグ (YES/NO)
\r
922 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
924 * エスケープコードは、次のものを使用する
\r
928 *----------------------------------------------------------------------------*/
\r
930 int ConvSJIStoJIS(CODECONVINFO *cInfo)
\r
938 cInfo->KanaProc = &ConvSJIStoJISkanaProc;
\r
943 Limit = cInfo->Buf + cInfo->BufSize - 5;
\r
945 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
953 if(cInfo->KanjiFst == 0)
\r
955 if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
956 ((uchar)*Str >= (uchar)0xE0))
\r
958 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
959 cInfo->KanjiFst = *Str++;
\r
961 else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF))
\r
963 Put = ConvSJIStoJISkanaProc(cInfo, *Str++, Put);
\r
967 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
968 if(cInfo->KanjiMode != CONV_ASCII)
\r
973 cInfo->KanjiMode = CONV_ASCII;
\r
980 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
981 if((uchar)*Str >= (uchar)0x40)
\r
983 if(cInfo->KanjiMode != CONV_KANJI)
\r
988 cInfo->KanjiMode = CONV_KANJI;
\r
991 Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++);
\r
992 Kcode = _mbcjmstojis(Kcode);
\r
993 *Put++ = HIGH8(Kcode);
\r
994 *Put++ = LOW8(Kcode);
\r
998 if(cInfo->KanjiMode != CONV_ASCII)
\r
1003 cInfo->KanjiMode = CONV_ASCII;
\r
1005 *Put++ = cInfo->KanjiFst;
\r
1008 cInfo->KanjiFst = 0;
\r
1013 cInfo->OutLen = Put - cInfo->Buf;
\r
1019 /*----- SHIFT-JIS-->JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
1022 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1024 * char *Put : データセット位置
\r
1027 * char *次のデータセット位置
\r
1028 *----------------------------------------------------------------------------*/
\r
1030 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
1035 if(cInfo->KanaCnv == NO)
\r
1039 if(cInfo->KanjiMode != CONV_KANA)
\r
1044 cInfo->KanjiMode = CONV_KANA;
\r
1046 *Put++ = (uchar)Dt - (uchar)0x80;
\r
1051 if(cInfo->KanaPrev != 0)
\r
1053 if(cInfo->KanjiMode != CONV_KANJI)
\r
1058 cInfo->KanjiMode = CONV_KANJI;
\r
1060 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
1061 Kcode = HanKataToZen(cInfo->KanaPrev) + Daku;
\r
1062 *Put++ = HIGH8(Kcode);
\r
1063 *Put++ = LOW8(Kcode);
\r
1066 cInfo->KanaPrev = Dt;
\r
1068 cInfo->KanaPrev = 0;
\r
1071 cInfo->KanaPrev = Dt;
\r
1077 /*----- SHIFT-JIS漢字コードをSamba-HEX漢字コードに変換 ------------------------
\r
1080 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1083 * int くり返しフラグ (YES/NO)
\r
1086 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1087 * 分割された入力文字列の変換はサポートしていない
\r
1088 * 半角カタカナの変換設定には対応していない
\r
1089 *----------------------------------------------------------------------------*/
\r
1091 int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo)
\r
1101 Limit = cInfo->Buf + cInfo->BufSize - 6;
\r
1103 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
1111 if((cInfo->StrLen >= 2) &&
\r
1112 ((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
1113 ((uchar)*Str >= (uchar)0xE0)))
\r
1115 sprintf(Put, "%c%02x%c%02x", SAMBA_HEX_TAG, (uchar)*Str, SAMBA_HEX_TAG, (uchar)*(Str+1));
\r
1120 else if((uchar)*Str >= (uchar)0x80)
\r
1122 sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++);
\r
1130 cInfo->OutLen = Put - cInfo->Buf;
\r
1136 /*----- SHIFT-JIS漢字コードをSamba-CAP漢字コードに変換 ------------------------
\r
1139 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1142 * int くり返しフラグ (YES/NO)
\r
1145 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1146 * 分割された入力文字列の変換はサポートしていない
\r
1147 *----------------------------------------------------------------------------*/
\r
1149 int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo)
\r
1159 Limit = cInfo->Buf + cInfo->BufSize - 6;
\r
1161 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
1169 if((uchar)*Str >= (uchar)0x80)
\r
1171 sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++);
\r
1179 cInfo->OutLen = Put - cInfo->Buf;
\r
1185 /*----- 1バイトカタカナをJIS漢字コードに変換 ---------------------------------
\r
1188 * char Ch : 1バイトカタカナコード
\r
1192 *----------------------------------------------------------------------------*/
\r
1194 static int HanKataToZen(char Ch)
\r
1196 static const int Katakana[] = {
\r
1197 0x2121, 0x2123, 0x2156, 0x2157, 0x2122, 0x2126, 0x2572, 0x2521,
\r
1198 0x2523, 0x2525, 0x2527, 0x2529, 0x2563, 0x2565, 0x2567, 0x2543,
\r
1199 0x213C, 0x2522, 0x2524, 0x2526, 0x2528, 0x252A, 0x252B, 0x252D,
\r
1200 0x252F, 0x2531, 0x2533, 0x2535, 0x2537, 0x2539, 0x253B, 0x253D,
\r
1201 0x253F, 0x2541, 0x2544, 0x2546, 0x2548, 0x254A, 0x254B, 0x254C,
\r
1202 0x254D, 0x254E, 0x254F, 0x2552, 0x2555, 0x2558, 0x255B, 0x255E,
\r
1203 0x255F, 0x2560, 0x2561, 0x2562, 0x2564, 0x2566, 0x2568, 0x2569,
\r
1204 0x256A, 0x256B, 0x256C, 0x256D, 0x256F, 0x2573, 0x212B, 0x212C
\r
1207 return(Katakana[(uchar)Ch - (uchar)0xA0]);
\r
1211 /*----- 濁音/半濁音になる文字かチェック --------------------------------------
\r
1214 * char Ch : 1バイトカタカナコード
\r
1215 * char Daku : 濁点/半濁点
\r
1218 * int 文字コードに加える値 (0=濁音/半濁音にならない)
\r
1219 *----------------------------------------------------------------------------*/
\r
1221 static int AskDakuon(char Ch, char Daku)
\r
1226 if((uchar)Daku == (uchar)0xDE)
\r
1228 if((((uchar)Ch >= (uchar)0xB6) && ((uchar)Ch <= (uchar)0xC4)) ||
\r
1229 (((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE)))
\r
1234 else if((uchar)Daku == (uchar)0xDF)
\r
1236 if(((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE))
\r
1255 /*----- 文字列の漢字コードを調べ、Shift-JISに変換 -----------------------------
\r
1258 * char *Text : 文字列
\r
1259 * int Pref : SJIS/EUCの優先指定
\r
1260 * KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない
\r
1264 *----------------------------------------------------------------------------*/
\r
1266 void ConvAutoToSJIS(char *Text, int Pref)
\r
1270 CODECONVINFO cInfo;
\r
1272 Code = CheckKanjiCode(Text, strlen(Text), Pref);
\r
1273 if(Code != KANJI_SJIS)
\r
1275 Buf = malloc(strlen(Text)+1);
\r
1278 InitCodeConvInfo(&cInfo);
\r
1279 cInfo.KanaCnv = NO;
\r
1281 cInfo.StrLen = strlen(Text);
\r
1283 cInfo.BufSize = strlen(Text);
\r
1288 ConvJIStoSJIS(&cInfo);
\r
1292 ConvEUCtoSJIS(&cInfo);
\r
1296 *(Buf + cInfo.OutLen) = NUL;
\r
1297 strcpy(Text, Buf);
\r
1305 /*----- 使われている漢字コードを調べる ----------------------------------------
\r
1308 * char *Text : 文字列
\r
1309 * int Size : 文字列の長さ
\r
1310 * int Pref : SJIS/EUCの優先指定
\r
1311 * KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない
\r
1314 * int 漢字コード (KANJI_xxx)
\r
1315 *----------------------------------------------------------------------------*/
\r
1317 int CheckKanjiCode(char *Text, int Size, int Pref)
\r
1329 Btm = Text + Size;
\r
1331 /* JIS漢字コードのチェック */
\r
1333 while((Pos = memchr(Pos, 0x1b, Btm-Pos-2)) != NULL)
\r
1336 if((memcmp(Pos, "$B", 2) == 0) || /* <ESC>$B */
\r
1337 (memcmp(Pos, "$@", 2) == 0) || /* <ESC>$@ */
\r
1338 (memcmp(Pos, "(I", 2) == 0)) /* <ESC>(I */
\r
1345 /* EUCとSHIFT-JIS漢字コードのチェック */
\r
1348 if(Pref != KANJI_NOCNV)
\r
1354 PointSJIS = CheckOnSJIS(Pos, Btm);
\r
1355 PointEUC = CheckOnEUC(Pos, Btm);
\r
1356 if(PointSJIS > PointEUC)
\r
1361 if(PointSJIS < PointEUC)
\r
1366 if((Pos = memchr(Pos, '\n', Btm-Pos)) == NULL)
\r
1379 /*----- SHIFT-JISコードの可能性があるかチェック --------------------------------
\r
1382 * uchar *Pos : 文字列
\r
1383 * uchar *Btm : 文字列の末尾
\r
1389 * High 81-FF (A0-DFは半角) (EB以降はほとんど無い)
\r
1391 *----------------------------------------------------------------------------*/
\r
1393 static int CheckOnSJIS(uchar *Pos, uchar *Btm)
\r
1400 while((Point > 0) && (Pos < Btm) && (*Pos != '\n'))
\r
1402 if(FstOnTwo == YES)
\r
1404 if((*Pos < 0x40) || (*Pos > 0xFC)) /* 2バイト目は 0x40~0xFC */
\r
1408 else if(*Pos >= 0x81)
\r
1410 if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 半角カナでなければ */
\r
1412 if(*Pos >= 0xEB) /* 1バイト目は0xEB以降はほとんど無い */
\r
1419 if(FstOnTwo == YES) /* 1バイト目で終わっているのはおかしい */
\r
1426 /*----- EUCコードの可能性があるかチェック -------------------------------------
\r
1429 * uchar *Pos : 文字列
\r
1430 * uchar *Btm : 文字列の末尾
\r
1438 *----------------------------------------------------------------------------*/
\r
1440 static int CheckOnEUC(uchar *Pos, uchar *Btm)
\r
1447 while((Point > 0) && (Pos < Btm) && (*Pos != '\n'))
\r
1451 if((*Pos < 0xA1) || (*Pos > 0xFE)) /* 2バイト目は 0xA1~0xFE */
\r
1455 else if(FstOnTwo == 2) /* 半角カナ */
\r
1457 if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 2バイト目は 0xA0~0xDF */
\r
1463 if(*Pos == 0x8E) /* 0x8E??は半角カナ */
\r
1465 else if((*Pos >= 0xA1) && (*Pos <= 0xFE))
\r
1470 if(FstOnTwo != 0) /* 1バイト目で終わっているのはおかしい */
\r
1478 /*----- UTF-8漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
1481 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1484 * int くり返しフラグ (YES/NO)
\r
1487 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1488 *----------------------------------------------------------------------------*/
\r
1491 // UTF-8からShift_JISへの変換後のバイト列が確定可能な長さを変換後の長さで返す
\r
1492 // バイナリ UTF-8 戻り値 Shift_JIS
\r
1493 // E3 81 82 E3 81 84 あい -> 2 82 A0 あ+結合文字の先頭バイトの可能性(い゛等)
\r
1494 // E3 81 82 E3 81 あ+E3 81 -> 0 結合文字の先頭バイトの可能性
\r
1495 // E3 81 82 E3 あ+E3 -> 0 結合文字の先頭バイトの可能性
\r
1496 // E3 81 82 あ -> 0 結合文字の先頭バイトの可能性
\r
1497 int ConvUTF8NtoSJIS_TruncateToDelimiter(char* pUTF8, int UTF8Length, int* pNewUTF8Length)
\r
1502 int NewSJISLength;
\r
1503 int NewUTF16Length;
\r
1504 // UTF-8の場合、不完全な文字は常に変換されない
\r
1505 // バイナリ UTF-8 バイナリ UTF-16 LE
\r
1506 // E3 81 82 E3 81 84 あい -> 42 30 44 30 あい
\r
1507 // E3 81 82 E3 81 あ+E3 81 -> 42 30 あ
\r
1508 // E3 81 82 E3 あ+E3 -> 42 30 あ
\r
1509 UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0);
\r
1510 if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))
\r
1512 // Shift_JISへ変換した時に文字数が増減する位置がUnicode結合文字の区切り
\r
1513 UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length);
\r
1514 SJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1515 NewSJISLength = SJISLength;
\r
1516 while(UTF8Length > 0 && NewSJISLength >= SJISLength)
\r
1519 UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length);
\r
1520 NewSJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1523 // UTF-16 LE変換した時に文字数が増減する位置がUTF-8の区切り
\r
1524 if(pNewUTF8Length)
\r
1526 NewUTF16Length = UTF16Length;
\r
1527 while(UTF8Length > 0 && NewUTF16Length >= UTF16Length)
\r
1530 NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0);
\r
1532 if(UTF16Length > 0)
\r
1534 *pNewUTF8Length = UTF8Length;
\r
1536 return NewSJISLength;
\r
1539 int ConvUTF8NtoSJIS(CODECONVINFO *cInfo)
\r
1543 // char temp_string[2048];
\r
1544 // int string_length;
\r
1547 // 終端のNULLを含むバグを修正
\r
1555 // 生成される中間コードのサイズを調べる
\r
1556 // string_length = MultiByteToWideChar(
\r
1557 // CP_UTF8, // 変換先文字コード
\r
1558 // 0, // フラグ(0:なし)
\r
1559 // cInfo->Str, // 変換元文字列
\r
1560 // -1, // 変換元文字列バイト数(-1:自動)
\r
1561 // NULL, // 変換した文字列の格納先
\r
1564 // 前回の変換不能な残りの文字列を入力の先頭に結合
\r
1565 SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;
\r
1566 if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))
\r
1568 *(cInfo->Buf) = '\0';
\r
1569 cInfo->BufSize = 0;
\r
1572 memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);
\r
1573 memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1574 *(pSrc + SrcLength) = '\0';
\r
1575 if(cInfo->EscFlush == NO)
\r
1577 // バッファに収まらないため変換文字数を半減
\r
1578 while(SrcLength > 0 && ConvUTF8NtoSJIS_TruncateToDelimiter(pSrc, SrcLength, &SrcLength) > cInfo->BufSize)
\r
1580 SrcLength = SrcLength / 2;
\r
1583 UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0);
\r
1585 // サイズ0 or バッファサイズより大きい場合は
\r
1586 // cInfo->Bufの最初に'\0'を入れて、
\r
1587 // cInfo->BufSizeに0を入れて返す。
\r
1588 // if( string_length == 0 ||
\r
1589 // string_length >= 1024 ){
\r
1590 // *(cInfo->Buf) = '\0';
\r
1591 // cInfo->BufSize = 0;
\r
1592 // return(Continue);
\r
1594 if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))
\r
1597 *(cInfo->Buf) = '\0';
\r
1598 cInfo->BufSize = 0;
\r
1602 // 中間コード(unicode)に変換
\r
1603 // MultiByteToWideChar(
\r
1604 // CP_UTF8, // 変換先文字コード
\r
1605 // 0, // フラグ(0:なし)
\r
1606 // cInfo->Str, // 変換元文字列
\r
1607 // -1, // 変換元文字列バイト数(-1:自動)
\r
1608 // (unsigned short *)temp_string, // 変換した文字列の格納先
\r
1611 MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, pUTF16, UTF16Length);
\r
1613 // 生成されるUTF-8コードのサイズを調べる
\r
1614 // string_length = WideCharToMultiByte(
\r
1615 // CP_ACP, // 変換先文字コード
\r
1616 // 0, // フラグ(0:なし)
\r
1617 // (unsigned short *)temp_string, // 変換元文字列
\r
1618 // -1, // 変換元文字列バイト数(-1:自動)
\r
1619 // NULL, // 変換した文字列の格納先
\r
1624 // サイズ0 or 出力バッファサイズより大きい場合は、
\r
1625 // cInfo->Bufの最初に'\0'を入れて、
\r
1626 // cInfo->BufSizeに0を入れて返す。
\r
1627 // if( string_length == 0 ||
\r
1628 // string_length >= cInfo->BufSize ){
\r
1629 // *(cInfo->Buf) = '\0';
\r
1630 // cInfo->BufSize = 0;
\r
1631 // return(Continue);
\r
1635 // cInfo->OutLen = string_length;
\r
1638 // WideCharToMultiByte(
\r
1639 // CP_ACP, // 変換先文字コード
\r
1640 // 0, // フラグ(0:なし)
\r
1641 // (unsigned short *)temp_string, // 変換元文字列
\r
1642 // -1, // 変換元文字列バイト数(-1:自動)
\r
1643 // cInfo->Buf, // 変換した文字列の格納先(BOM:3bytes)
\r
1644 // cInfo->BufSize, // 格納先サイズ
\r
1647 cInfo->OutLen = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1648 cInfo->Str += SrcLength - cInfo->EscUTF8Len;
\r
1649 cInfo->StrLen -= SrcLength - cInfo->EscUTF8Len;
\r
1650 cInfo->EscUTF8Len = 0;
\r
1651 if(ConvUTF8NtoSJIS_TruncateToDelimiter(cInfo->Str, cInfo->StrLen, NULL) > 0)
\r
1655 // 変換不能なため次の入力の先頭に結合
\r
1656 memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1657 cInfo->EscUTF8Len = cInfo->StrLen;
\r
1658 cInfo->Str += cInfo->StrLen;
\r
1659 cInfo->StrLen = 0;
\r
1660 cInfo->FlushProc = ConvUTF8NtoSJIS;
\r
1670 /*----- SHIFT-JIS漢字コードをUTF-8漢字コードに変換 ------------------------------
\r
1673 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1676 * int くり返しフラグ (YES/NO)
\r
1679 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1680 *----------------------------------------------------------------------------*/
\r
1681 int ConvSJIStoUTF8N(CODECONVINFO *cInfo)
\r
1685 // char temp_string[2048];
\r
1686 int string_length;
\r
1689 // 終端のNULLを含むバグを修正
\r
1698 // 生成される中間コードのサイズを調べる
\r
1699 // string_length = MultiByteToWideChar(
\r
1700 // CP_ACP, // 変換先文字コード
\r
1701 // 0, // フラグ(0:なし)
\r
1702 // cInfo->Str, // 変換元文字列
\r
1703 // -1, // 変換元文字列バイト数(-1:自動)
\r
1704 // NULL, // 変換した文字列の格納先
\r
1707 // 前回の変換不能な残りの文字列を入力の先頭に結合
\r
1708 SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;
\r
1709 if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))
\r
1711 *(cInfo->Buf) = '\0';
\r
1712 cInfo->BufSize = 0;
\r
1715 memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);
\r
1716 memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1717 *(pSrc + SrcLength) = '\0';
\r
1718 if(cInfo->EscFlush == NO)
\r
1720 // Shift_JISの場合、不完全な文字でも変換されることがあるため、末尾の不完全な部分を削る
\r
1722 while(Count < SrcLength)
\r
1724 if(((unsigned char)*(pSrc + Count) >= 0x81 && (unsigned char)*(pSrc + Count) <= 0x9f) || (unsigned char)*(pSrc + Count) >= 0xe0)
\r
1726 if((unsigned char)*(pSrc + Count + 1) >= 0x40)
\r
1730 if(Count + 2 > SrcLength)
\r
1738 SrcLength = Count;
\r
1740 UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, NULL, 0);
\r
1742 // サイズ0 or バッファサイズより大きい場合は、
\r
1743 // cInfo->Bufの最初に'\0'を入れて、
\r
1744 // cInfo->BufSizeに0を入れて返す。
\r
1745 // if( string_length == 0 ||
\r
1746 // string_length >= 1024 ){
\r
1747 // *(cInfo->Buf) = '\0';
\r
1748 // cInfo->BufSize = 0;
\r
1749 // return(Continue);
\r
1751 if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))
\r
1754 *(cInfo->Buf) = '\0';
\r
1755 cInfo->BufSize = 0;
\r
1759 // 中間コード(unicode)に変換
\r
1760 // MultiByteToWideChar(
\r
1761 // CP_ACP, // 変換先文字コード
\r
1762 // 0, // フラグ(0:なし)
\r
1763 // cInfo->Str, // 変換元文字列
\r
1764 // -1, // 変換元文字列バイト数(-1:自動)
\r
1765 // (unsigned short *)temp_string, // 変換した文字列の格納先
\r
1768 MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, pUTF16, UTF16Length);
\r
1770 // 生成されるUTF-8コードのサイズを調べる
\r
1771 // string_length = WideCharToMultiByte(
\r
1772 // CP_UTF8, // 変換先文字コード
\r
1773 // 0, // フラグ(0:なし)
\r
1774 // (unsigned short *)temp_string, // 変換元文字列
\r
1775 // -1, // 変換元文字列バイト数(-1:自動)
\r
1776 // NULL, // 変換した文字列の格納先
\r
1780 string_length = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1782 // サイズ0 or 出力バッファサイズより大きい場合は、
\r
1783 // cInfo->Bufの最初に'\0'を入れて、
\r
1784 // cInfo->BufSizeに0を入れて返す。
\r
1785 // if( string_length == 0 ||
\r
1786 // string_length >= cInfo->BufSize ){
\r
1787 // *(cInfo->Buf) = '\0';
\r
1788 // cInfo->BufSize = 0;
\r
1789 // return(Continue);
\r
1793 // cInfo->OutLen = string_length;
\r
1796 // ↓付けちゃだめ コマンドにも追加されてしまう
\r
1797 // 出力文字列の先頭にBOM(byte order mark)をつける
\r
1798 *(cInfo->Buf) = (char)0xef;
\r
1799 *(cInfo->Buf+1) = (char)0xbb;
\r
1800 *(cInfo->Buf+2) = (char)0xbf;
\r
1804 // WideCharToMultiByte(
\r
1805 // CP_UTF8, // 変換先文字コード
\r
1806 // 0, // フラグ(0:なし)
\r
1807 // (unsigned short *)temp_string, // 変換元文字列
\r
1808 // -1, // 変換元文字列バイト数(-1:自動)
\r
1809 // cInfo->Buf, // 変換した文字列の格納先(BOM:3bytes)
\r
1810 // cInfo->BufSize, // 格納先サイズ
\r
1813 cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1814 // バッファに収まらないため変換文字数を半減
\r
1815 while(cInfo->OutLen == 0 && UTF16Length > 0)
\r
1817 UTF16Length = UTF16Length / 2;
\r
1818 cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1820 // 変換された元の文字列での文字数を取得
\r
1821 Count = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1823 UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc + Count, SrcLength - Count, NULL, 0);
\r
1824 cInfo->Str += Count - cInfo->EscUTF8Len;
\r
1825 cInfo->StrLen -= Count - cInfo->EscUTF8Len;
\r
1826 cInfo->EscUTF8Len = 0;
\r
1827 if(UTF16Length > 0)
\r
1831 // 変換不能なため次の入力の先頭に結合
\r
1832 memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1833 cInfo->EscUTF8Len = cInfo->StrLen;
\r
1834 cInfo->Str += cInfo->StrLen;
\r
1835 cInfo->StrLen = 0;
\r
1836 cInfo->FlushProc = ConvSJIStoUTF8N;
\r
1848 /*----- IBM拡張漢字をNEC選定IBM拡張漢字等に変換 -------------------------------
\r
1855 *----------------------------------------------------------------------------*/
\r
1856 static int ConvertIBMExtendedChar(int code)
\r
1858 if((code >= 0xfa40) && (code <= 0xfa49)) code -= (0xfa40 - 0xeeef);
\r
1859 else if((code >= 0xfa4a) && (code <= 0xfa53)) code -= (0xfa4a - 0x8754);
\r
1860 else if((code >= 0xfa54) && (code <= 0xfa57)) code -= (0xfa54 - 0xeef9);
\r
1861 else if(code == 0xfa58) code = 0x878a;
\r
1862 else if(code == 0xfa59) code = 0x8782;
\r
1863 else if(code == 0xfa5a) code = 0x8784;
\r
1864 else if(code == 0xfa5b) code = 0x879a;
\r
1865 else if((code >= 0xfa5c) && (code <= 0xfa7e)) code -= (0xfa5c - 0xed40);
\r
1866 else if((code >= 0xfa80) && (code <= 0xfa9b)) code -= (0xfa80 - 0xed63);
\r
1867 else if((code >= 0xfa9c) && (code <= 0xfafc)) code -= (0xfa9c - 0xed80);
\r
1868 else if((code >= 0xfb40) && (code <= 0xfb5b)) code -= (0xfb40 - 0xede1);
\r
1869 else if((code >= 0xfb5c) && (code <= 0xfb7e)) code -= (0xfb5c - 0xee40);
\r
1870 else if((code >= 0xfb80) && (code <= 0xfb9b)) code -= (0xfb80 - 0xee63);
\r
1871 else if((code >= 0xfb9c) && (code <= 0xfbfc)) code -= (0xfb9c - 0xee80);
\r
1872 else if((code >= 0xfc40) && (code <= 0xfc4b)) code -= (0xfc40 - 0xeee1);
\r