-/*=============================================================================\r
+/*=============================================================================\r
*\r
-* \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\81^\89ü\8ds\83R\81[\83h\95Ï\8a·\r
+* 漢字コード変換/改行コード変換\r
*\r
===============================================================================\r
/ Copyright (C) 1997-2007 Sota. All rights reserved.\r
#include <stdio.h>\r
#include <stdlib.h>\r
#include <string.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
#include <mbstring.h>\r
#include <windowsx.h>\r
\r
\r
\r
\r
-#define CONV_ASCII 0 /* ASCII\95¶\8e\9a\8f\88\97\9d\92\86 */\r
-#define CONV_KANJI 1 /* \8a¿\8e\9a\8f\88\97\9d\92\86 */\r
-#define CONV_KANA 2 /* \94¼\8ap\83J\83^\83J\83i\8f\88\97\9d\92\86 */\r
+#define CONV_ASCII 0 /* ASCII文字処理中 */\r
+#define CONV_KANJI 1 /* 漢字処理中 */\r
+#define CONV_KANA 2 /* 半角カタカナ処理中 */\r
\r
\r
-/*===== \83v\83\8d\83g\83^\83C\83v =====*/\r
+/*===== プロトタイプ =====*/\r
\r
static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);\r
static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);\r
\r
\r
#if 0\r
-/*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\83e\83X\83g\83v\83\8d\83O\83\89\83\80 ------------------------------------*/\r
+/*----- 漢字コード変換のテストプログラム ------------------------------------*/\r
\r
void CodeCnvTest(void)\r
{\r
\r
\r
#if 0\r
-/*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\83e\83X\83g\83v\83\8d\83O\83\89\83\80 ------------------------------------*/\r
+/*----- 改行コード変換のテストプログラム ------------------------------------*/\r
\r
void TermCodeCnvTest(void)\r
{\r
\r
\r
\r
-/*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\82ð\8f\89\8aú\89» --------------------------------------------\r
+/*----- 改行コード変換情報を初期化 --------------------------------------------\r
*\r
* Parameter\r
-* TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* TERMCODECONVINFO *cInfo : 改行コード変換情報\r
*\r
* Return Value\r
-* \82È\82µ\r
+* なし\r
*----------------------------------------------------------------------------*/\r
\r
void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\8ec\82è\8fî\95ñ\82ð\8fo\97Í ----------------------------------------\r
+/*----- 改行コード変換の残り情報を出力 ----------------------------------------\r
*\r
* Parameter\r
-* TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* TERMCODECONVINFO *cInfo : 改行コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (=NO)\r
+* int くり返しフラグ (=NO)\r
*\r
* Note\r
-* \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\8dÅ\8cã\82É\8cÄ\82Ô\8e\96\r
+* 改行コード変換の最後に呼ぶ事\r
*----------------------------------------------------------------------------*/\r
\r
int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- \89ü\8ds\83R\81[\83h\82ðCRLF\82É\95Ï\8a· -------------------------------------------------\r
+/*----- 改行コードをCRLFに変換 -------------------------------------------------\r
*\r
* Parameter\r
-* TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* TERMCODECONVINFO *cInfo : 改行コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
*----------------------------------------------------------------------------*/\r
\r
int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\82ð\8f\89\8aú\89» --------------------------------------------\r
+/*----- 漢字コード変換情報を初期化 --------------------------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* \82È\82µ\r
+* なし\r
*----------------------------------------------------------------------------*/\r
\r
void InitCodeConvInfo(CODECONVINFO *cInfo)\r
cInfo->KanjiFst = 0;\r
cInfo->KanaPrev = 0;\r
cInfo->KanaProc = NULL;\r
- // UTF-8\91Î\89\9e\r
+ // UTF-8対応\r
cInfo->EscUTF8Len = 0;\r
+ cInfo->EscFlush = NO;\r
+ cInfo->FlushProc = NULL;\r
return;\r
}\r
\r
\r
-/*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\8ec\82è\8fî\95ñ\82ð\8fo\97Í ----------------------------------------\r
+/*----- 漢字コード変換の残り情報を出力 ----------------------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (=NO)\r
+* int くり返しフラグ (=NO)\r
*\r
* Note\r
-* \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\8dÅ\8cã\82É\8cÄ\82Ô\8e\96\r
+* 漢字コード変換の最後に呼ぶ事\r
*----------------------------------------------------------------------------*/\r
\r
int FlushRestData(CODECONVINFO *cInfo)\r
{\r
char *Put;\r
\r
+ // UTF-8対応\r
+ if(cInfo->FlushProc != NULL)\r
+ {\r
+ cInfo->EscFlush = YES;\r
+ return cInfo->FlushProc(cInfo);\r
+ }\r
+\r
Put = cInfo->Buf;\r
\r
if(cInfo->KanaProc != NULL)\r
*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
}\r
\r
\r
-/*----- EUC\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- EUC漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
*----------------------------------------------------------------------------*/\r
\r
int ConvEUCtoSJIS(CODECONVINFO *cInfo)\r
cInfo->KanjiFst = *Str++;\r
else\r
{\r
- if((uchar)cInfo->KanjiFst == (uchar)0x8E) /* \94¼\8ap\83J\83^\83J\83i */\r
+ if((uchar)cInfo->KanjiFst == (uchar)0x8E) /* 半角カタカナ */\r
{\r
Put = ConvEUCtoSJISkanaProc(cInfo, *Str++, Put);\r
}\r
}\r
\r
\r
-/*----- EUC-->SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
+/*----- EUC-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
-* char Dt : \95¶\8e\9a\r
-* char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
+* char Dt : 文字\r
+* char *Put : データセット位置\r
*\r
* Return Value\r
-* char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+* char *次のデータセット位置\r
*----------------------------------------------------------------------------*/\r
\r
static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
}\r
\r
\r
-/*----- JIS\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- JIS漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
*\r
-* \83G\83X\83P\81[\83v\83R\81[\83h\82Í\81A\8e\9f\82Ì\82à\82Ì\82É\91Î\89\9e\82µ\82Ä\82¢\82é\r
-* \8a¿\8e\9a\8aJ\8en <ESC>$B <ESC>$@\r
-* \94¼\8ap\83J\83i\8aJ\8en <ESC>(I\r
-* \8a¿\8e\9a\8fI\97¹ <ESC>(B <ESC>(J <ESC>(H\r
+* エスケープコードは、次のものに対応している\r
+* 漢字開始 <ESC>$B <ESC>$@\r
+* 半角カナ開始 <ESC>(I\r
+* 漢字終了 <ESC>(B <ESC>(J <ESC>(H\r
*----------------------------------------------------------------------------*/\r
\r
int ConvJIStoSJIS(CODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- JIS-->SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
+/*----- JIS-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
-* char Dt : \95¶\8e\9a\r
-* char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
+* char Dt : 文字\r
+* char *Put : データセット位置\r
*\r
* Return Value\r
-* char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+* char *次のデータセット位置\r
*----------------------------------------------------------------------------*/\r
\r
static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
}\r
\r
\r
-/*----- Samba-HEX/Samba-CAP\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· --------------\r
+/*----- Samba-HEX/Samba-CAP漢字コードをSHIFT-JIS漢字コードに変換 --------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
-* \95ª\8a\84\82³\82ê\82½\93ü\97Í\95¶\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
-* \94¼\8ap\83J\83^\83J\83i\82Ì\95Ï\8a·\90Ý\92è\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82È\82¢\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
+* 分割された入力文字列の変換はサポートしていない\r
+* 半角カタカナの変換設定には対応していない\r
*----------------------------------------------------------------------------*/\r
\r
int ConvSMBtoSJIS(CODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðEUC\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- SHIFT-JIS漢字コードをEUC漢字コードに変換 ------------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
*----------------------------------------------------------------------------*/\r
\r
int ConvSJIStoEUC(CODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- SHIFT-JIS-->EUC\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
+/*----- SHIFT-JIS-->EUC漢字コードに変換の半角カタカナの処理 -------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
-* char Dt : \95¶\8e\9a\r
-* char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
+* char Dt : 文字\r
+* char *Put : データセット位置\r
*\r
* Return Value\r
-* char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+* char *次のデータセット位置\r
*----------------------------------------------------------------------------*/\r
\r
static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
}\r
\r
\r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðJIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- SHIFT-JIS漢字コードをJIS漢字コードに変換 ------------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
*\r
-* \83G\83X\83P\81[\83v\83R\81[\83h\82Í\81A\8e\9f\82Ì\82à\82Ì\82ð\8eg\97p\82·\82é\r
-* \8a¿\8e\9a\8aJ\8en <ESC>$B\r
-* \94¼\8ap\83J\83i\8aJ\8en <ESC>(I\r
-* \8a¿\8e\9a\8fI\97¹ <ESC>(B\r
+* エスケープコードは、次のものを使用する\r
+* 漢字開始 <ESC>$B\r
+* 半角カナ開始 <ESC>(I\r
+* 漢字終了 <ESC>(B\r
*----------------------------------------------------------------------------*/\r
\r
int ConvSJIStoJIS(CODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- SHIFT-JIS-->JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
+/*----- SHIFT-JIS-->JIS漢字コードに変換の半角カタカナの処理 -------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
-* char Dt : \95¶\8e\9a\r
-* char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
+* char Dt : 文字\r
+* char *Put : データセット位置\r
*\r
* Return Value\r
-* char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+* char *次のデータセット位置\r
*----------------------------------------------------------------------------*/\r
\r
static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
}\r
\r
\r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðSamba-HEX\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------\r
+/*----- SHIFT-JIS漢字コードをSamba-HEX漢字コードに変換 ------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
-* \95ª\8a\84\82³\82ê\82½\93ü\97Í\95¶\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
-* \94¼\8ap\83J\83^\83J\83i\82Ì\95Ï\8a·\90Ý\92è\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82È\82¢\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
+* 分割された入力文字列の変換はサポートしていない\r
+* 半角カタカナの変換設定には対応していない\r
*----------------------------------------------------------------------------*/\r
\r
int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðSamba-CAP\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------\r
+/*----- SHIFT-JIS漢字コードをSamba-CAP漢字コードに変換 ------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
-* \95ª\8a\84\82³\82ê\82½\93ü\97Í\95¶\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
+* 分割された入力文字列の変換はサポートしていない\r
*----------------------------------------------------------------------------*/\r
\r
int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo)\r
}\r
\r
\r
-/*----- \82P\83o\83C\83g\83J\83^\83J\83i\82ðJIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ---------------------------------\r
+/*----- 1バイトカタカナをJIS漢字コードに変換 ---------------------------------\r
*\r
* Parameter\r
-* char Ch : \82P\83o\83C\83g\83J\83^\83J\83i\83R\81[\83h\r
+* char Ch : 1バイトカタカナコード\r
*\r
* Return Value\r
-* int JIS\8a¿\8e\9a\83R\81[\83h\r
+* int JIS漢字コード\r
*----------------------------------------------------------------------------*/\r
\r
static int HanKataToZen(char Ch)\r
}\r
\r
\r
-/*----- \91÷\89¹\81^\94¼\91÷\89¹\82É\82È\82é\95¶\8e\9a\82©\83`\83F\83b\83N --------------------------------------\r
+/*----- 濁音/半濁音になる文字かチェック --------------------------------------\r
*\r
* Parameter\r
-* char Ch : \82P\83o\83C\83g\83J\83^\83J\83i\83R\81[\83h\r
-* char Daku : \91÷\93_\81^\94¼\91÷\93_\r
+* char Ch : 1バイトカタカナコード\r
+* char Daku : 濁点/半濁点\r
*\r
* Return Value\r
-* int \95¶\8e\9a\83R\81[\83h\82É\89Á\82¦\82é\92l (0=\91÷\89¹\81^\94¼\91÷\89¹\82É\82È\82ç\82È\82¢)\r
+* int 文字コードに加える値 (0=濁音/半濁音にならない)\r
*----------------------------------------------------------------------------*/\r
\r
static int AskDakuon(char Ch, char Daku)\r
\r
\r
\r
-/*----- \95¶\8e\9a\97ñ\82Ì\8a¿\8e\9a\83R\81[\83h\82ð\92²\82×\81AShift-JIS\82É\95Ï\8a· -----------------------------\r
+/*----- 文字列の漢字コードを調べ、Shift-JISに変換 -----------------------------\r
*\r
* Parameter\r
-* char *Text : \95¶\8e\9a\97ñ\r
-* int Pref : SJIS/EUC\82Ì\97D\90æ\8ew\92è\r
-\81\96 KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUC\82Ì\83`\83F\83b\83N\82Í\82µ\82È\82¢\r
+* char *Text : 文字列\r
+* int Pref : SJIS/EUCの優先指定\r
+* KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない\r
*\r
* Return Value\r
-* \82È\82µ\r
+* なし\r
*----------------------------------------------------------------------------*/\r
\r
void ConvAutoToSJIS(char *Text, int Pref)\r
}\r
\r
\r
-/*----- \8eg\82í\82ê\82Ä\82¢\82é\8a¿\8e\9a\83R\81[\83h\82ð\92²\82×\82é ----------------------------------------\r
+/*----- 使われている漢字コードを調べる ----------------------------------------\r
*\r
* Parameter\r
-* char *Text : \95¶\8e\9a\97ñ\r
-* int Size : \95¶\8e\9a\97ñ\82Ì\92·\82³\r
-* int Pref : SJIS/EUC\82Ì\97D\90æ\8ew\92è\r
-\81\96 KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUC\82Ì\83`\83F\83b\83N\82Í\82µ\82È\82¢\r
+* char *Text : 文字列\r
+* int Size : 文字列の長さ\r
+* int Pref : SJIS/EUCの優先指定\r
+* KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない\r
*\r
* Return Value\r
-* int \8a¿\8e\9a\83R\81[\83h (KANJI_xxx)\r
+* int 漢字コード (KANJI_xxx)\r
*----------------------------------------------------------------------------*/\r
\r
int CheckKanjiCode(char *Text, int Size, int Pref)\r
Ret = -1;\r
Btm = Text + Size;\r
\r
- /* JIS\8a¿\8e\9a\83R\81[\83h\82Ì\83`\83F\83b\83N */\r
+ /* JIS漢字コードのチェック */\r
Pos = Text;\r
while((Pos = memchr(Pos, 0x1b, Btm-Pos-2)) != NULL)\r
{\r
}\r
}\r
\r
- /* EUC\82ÆSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82Ì\83`\83F\83b\83N */\r
+ /* EUCとSHIFT-JIS漢字コードのチェック */\r
if(Ret == -1)\r
{\r
if(Pref != KANJI_NOCNV)\r
}\r
\r
\r
-/*----- SHIFT-JIS\83R\81[\83h\82Ì\89Â\94\\90«\82ª\82 \82é\82©\83`\83F\83b\83N --------------------------------\r
+/*----- SHIFT-JISコードの可能性があるかチェック --------------------------------\r
*\r
* Parameter\r
-* uchar *Pos : \95¶\8e\9a\97ñ\r
-* uchar *Btm : \95¶\8e\9a\97ñ\82Ì\96\96\94ö\r
+* uchar *Pos : 文字列\r
+* uchar *Btm : 文字列の末尾\r
*\r
* Return Value\r
-* int \93¾\93_\r
+* int 得点\r
*\r
* Note\r
-* High 81-FF (A0-DF\82Í\94¼\8ap) (EB\88È\8d~\82Í\82Ù\82Æ\82ñ\82Ç\96³\82¢)\r
+* High 81-FF (A0-DFは半角) (EB以降はほとんど無い)\r
* Low 40-FC\r
*----------------------------------------------------------------------------*/\r
\r
{\r
if(FstOnTwo == YES)\r
{\r
- if((*Pos < 0x40) || (*Pos > 0xFC)) /* 2\83o\83C\83g\96Ú\82Í 0x40\81`0xFC */\r
+ if((*Pos < 0x40) || (*Pos > 0xFC)) /* 2バイト目は 0x40~0xFC */\r
Point = 0;\r
FstOnTwo = NO;\r
}\r
else if(*Pos >= 0x81)\r
{\r
- if((*Pos < 0xA0) || (*Pos > 0xDF)) /* \94¼\8ap\83J\83i\82Å\82È\82¯\82ê\82Î */\r
+ if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 半角カナでなければ */\r
{\r
- if(*Pos >= 0xEB) /* 1\83o\83C\83g\96Ú\82Í0xEB\88È\8d~\82Í\82Ù\82Æ\82ñ\82Ç\96³\82¢ */\r
+ if(*Pos >= 0xEB) /* 1バイト目は0xEB以降はほとんど無い */\r
Point -= 50;\r
FstOnTwo = YES;\r
}\r
}\r
Pos++;\r
}\r
- if(FstOnTwo == YES) /* \82P\83o\83C\83g\96Ú\82Å\8fI\82í\82Á\82Ä\82¢\82é\82Ì\82Í\82¨\82©\82µ\82¢ */\r
+ if(FstOnTwo == YES) /* 1バイト目で終わっているのはおかしい */\r
Point = 0;\r
\r
return(Point);\r
}\r
\r
\r
-/*----- EUC\83R\81[\83h\82Ì\89Â\94\\90«\82ª\82 \82é\82©\83`\83F\83b\83N -------------------------------------\r
+/*----- EUCコードの可能性があるかチェック -------------------------------------\r
*\r
* Parameter\r
-* uchar *Pos : \95¶\8e\9a\97ñ\r
-* uchar *Btm : \95¶\8e\9a\97ñ\82Ì\96\96\94ö\r
+* uchar *Pos : 文字列\r
+* uchar *Btm : 文字列の末尾\r
*\r
* Return Value\r
-* int \93¾\93_\r
+* int 得点\r
*\r
* Note\r
* High A1-FE , 8E\r
{\r
if(FstOnTwo == 1)\r
{\r
- if((*Pos < 0xA1) || (*Pos > 0xFE)) /* 2\83o\83C\83g\96Ú\82Í 0xA1\81`0xFE */\r
+ if((*Pos < 0xA1) || (*Pos > 0xFE)) /* 2バイト目は 0xA1~0xFE */\r
Point = 0;\r
FstOnTwo = 0;\r
}\r
- else if(FstOnTwo == 2) /* \94¼\8ap\83J\83i */\r
+ else if(FstOnTwo == 2) /* 半角カナ */\r
{\r
- if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 2\83o\83C\83g\96Ú\82Í 0xA0\81`0xDF */\r
+ if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 2バイト目は 0xA0~0xDF */\r
Point = 0;\r
FstOnTwo = 0;\r
}\r
else\r
{\r
- if(*Pos == 0x8E) /* 0x8E??\82Í\94¼\8ap\83J\83i */\r
+ if(*Pos == 0x8E) /* 0x8E??は半角カナ */\r
FstOnTwo = 2;\r
else if((*Pos >= 0xA1) && (*Pos <= 0xFE))\r
FstOnTwo = 1;\r
}\r
Pos++;\r
}\r
- if(FstOnTwo != 0) /* \82P\83o\83C\83g\96Ú\82Å\8fI\82í\82Á\82Ä\82¢\82é\82Ì\82Í\82¨\82©\82µ\82¢ */\r
+ if(FstOnTwo != 0) /* 1バイト目で終わっているのはおかしい */\r
Point = 0;\r
\r
return(Point);\r
}\r
\r
\r
-// UTF-8N\91Î\89\9e \82±\82±\82©\82ç\81«\r
-/*----- UTF-8N\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+// UTF-8対応 ここから↓\r
+/*----- UTF-8漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
*----------------------------------------------------------------------------*/\r
\r
+// UTF-8対応\r
+// UTF-8からShift_JISへの変換後のバイト列が確定可能な長さを変換後の長さで返す\r
+// バイナリ UTF-8 戻り値 Shift_JIS\r
+// E3 81 82 E3 81 84 あい -> 2 82 A0 あ+結合文字の先頭バイトの可能性(い゛等)\r
+// E3 81 82 E3 81 あ+E3 81 -> 0 結合文字の先頭バイトの可能性\r
+// E3 81 82 E3 あ+E3 -> 0 結合文字の先頭バイトの可能性\r
+// E3 81 82 あ -> 0 結合文字の先頭バイトの可能性\r
+int ConvUTF8NtoSJIS_TruncateToDelimiter(char* pUTF8, int UTF8Length, int* pNewUTF8Length)\r
+{\r
+ int UTF16Length;\r
+ wchar_t* pUTF16;\r
+ int SJISLength;\r
+ int NewSJISLength;\r
+ int NewUTF16Length;\r
+ // UTF-8の場合、不完全な文字は常に変換されない\r
+ // バイナリ UTF-8 バイナリ UTF-16 LE\r
+ // E3 81 82 E3 81 84 あい -> 42 30 44 30 あい\r
+ // E3 81 82 E3 81 あ+E3 81 -> 42 30 あ\r
+ // E3 81 82 E3 あ+E3 -> 42 30 あ\r
+ UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0);\r
+ if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))\r
+ return -1;\r
+ // Shift_JISへ変換した時に文字数が増減する位置がUnicode結合文字の区切り\r
+ UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length);\r
+ SJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
+ NewSJISLength = SJISLength;\r
+ while(UTF8Length > 0 && NewSJISLength >= SJISLength)\r
+ {\r
+ UTF8Length--;\r
+ UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length);\r
+ NewSJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
+ }\r
+ free(pUTF16);\r
+ // UTF-16 LE変換した時に文字数が増減する位置がUTF-8の区切り\r
+ if(pNewUTF8Length)\r
+ {\r
+ NewUTF16Length = UTF16Length;\r
+ while(UTF8Length > 0 && NewUTF16Length >= UTF16Length)\r
+ {\r
+ UTF8Length--;\r
+ NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0);\r
+ }\r
+ if(UTF16Length > 0)\r
+ UTF8Length++;\r
+ *pNewUTF8Length = UTF8Length;\r
+ }\r
+ return NewSJISLength;\r
+}\r
+\r
int ConvUTF8NtoSJIS(CODECONVINFO *cInfo)\r
{\r
int Continue;\r
\r
// char temp_string[2048];\r
- int string_length;\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
+ // 大きいサイズに対応\r
+ // 終端のNULLを含むバグを修正\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
+ // 生成される中間コードのサイズを調べる\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
+// CP_UTF8, // 変換先文字コード\r
+// 0, // フラグ(0:なし)\r
+// cInfo->Str, // 変換元文字列\r
+// -1, // 変換元文字列バイト数(-1:自動)\r
+// NULL, // 変換した文字列の格納先\r
+// 0 // 格納先サイズ\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
+ // 前回の変換不能な残りの文字列を入力の先頭に結合\r
SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;\r
if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))\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
+ if(cInfo->EscFlush == NO)\r
+ {\r
+ // バッファに収まらないため変換文字数を半減\r
+ while(SrcLength > 0 && ConvUTF8NtoSJIS_TruncateToDelimiter(pSrc, SrcLength, &SrcLength) > cInfo->BufSize)\r
+ {\r
+ SrcLength = SrcLength / 2;\r
+ }\r
+ }\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
+ // サイズ0 or バッファサイズより大きい場合は\r
+ // cInfo->Bufの最初に'\0'を入れて、\r
+ // cInfo->BufSizeに0を入れて返す。\r
// if( string_length == 0 ||\r
// string_length >= 1024 ){\r
// *(cInfo->Buf) = '\0';\r
return Continue;\r
}\r
\r
- // \92\86\8aÔ\83R\81[\83h(unicode)\82É\95Ï\8a·\r
+ // 中間コード(unicode)に変換\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
+// CP_UTF8, // 変換先文字コード\r
+// 0, // フラグ(0:なし)\r
+// cInfo->Str, // 変換元文字列\r
+// -1, // 変換元文字列バイト数(-1:自動)\r
+// (unsigned short *)temp_string, // 変換した文字列の格納先\r
+// 1024 // 格納先サイズ\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
+ // 生成されるUTF-8コードのサイズを調べる\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
+// CP_ACP, // 変換先文字コード\r
+// 0, // フラグ(0:なし)\r
+// (unsigned short *)temp_string, // 変換元文字列\r
+// -1, // 変換元文字列バイト数(-1:自動)\r
+// NULL, // 変換した文字列の格納先\r
+// 0, // 格納先サイズ\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
+ // サイズ0 or 出力バッファサイズより大きい場合は、\r
+ // cInfo->Bufの最初に'\0'を入れて、\r
+ // cInfo->BufSizeに0を入れて返す。\r
// if( string_length == 0 ||\r
// string_length >= cInfo->BufSize ){\r
// *(cInfo->Buf) = '\0';\r
// return(Continue);\r
// }\r
\r
- // \8fo\97Í\83T\83C\83Y\82ð\90Ý\92è\r
+ // 出力サイズを設定\r
// cInfo->OutLen = string_length;\r
\r
- // UTF-8\83R\81[\83h\82É\95Ï\8a·\r
+ // UTF-8コードに変換\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
+// CP_ACP, // 変換先文字コード\r
+// 0, // フラグ(0:なし)\r
+// (unsigned short *)temp_string, // 変換元文字列\r
+// -1, // 変換元文字列バイト数(-1:自動)\r
+// cInfo->Buf, // 変換した文字列の格納先(BOM:3bytes)\r
+// cInfo->BufSize, // 格納先サイズ\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->Str += SrcLength - cInfo->EscUTF8Len;\r
+ cInfo->StrLen -= SrcLength - cInfo->EscUTF8Len;\r
cInfo->EscUTF8Len = 0;\r
- if(UTF16Length > 0)\r
+ if(ConvUTF8NtoSJIS_TruncateToDelimiter(cInfo->Str, cInfo->StrLen, NULL) > 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
+ // 変換不能なため次の入力の先頭に結合\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
+ cInfo->FlushProc = ConvUTF8NtoSJIS;\r
Continue = NO;\r
}\r
\r
return(Continue);\r
}\r
\r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðUTF-8N\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- SHIFT-JIS漢字コードをUTF-8漢字コードに変換 ------------------------------\r
*\r
* Parameter\r
-* CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+* CODECONVINFO *cInfo : 漢字コード変換情報\r
*\r
* Return Value\r
-* int \82\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+* int くり返しフラグ (YES/NO)\r
*\r
* Note\r
-* \82\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+* くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
*----------------------------------------------------------------------------*/\r
int ConvSJIStoUTF8N(CODECONVINFO *cInfo)\r
{\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
+ // 大きいサイズに対応\r
+ // 終端のNULLを含むバグを修正\r
int SrcLength;\r
char* pSrc;\r
wchar_t* pUTF16;\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
+ // 生成される中間コードのサイズを調べる\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
+// CP_ACP, // 変換先文字コード\r
+// 0, // フラグ(0:なし)\r
+// cInfo->Str, // 変換元文字列\r
+// -1, // 変換元文字列バイト数(-1:自動)\r
+// NULL, // 変換した文字列の格納先\r
+// 0 // 格納先サイズ\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
+ // 前回の変換不能な残りの文字列を入力の先頭に結合\r
SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;\r
if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))\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
+ if(cInfo->EscFlush == NO)\r
{\r
- if(((unsigned char)*(pSrc + Count) >= 0x81 && (unsigned char)*(pSrc + Count) <= 0x9f) || (unsigned char)*(pSrc + Count) >= 0xe0)\r
+ // Shift_JISの場合、不完全な文字でも変換されることがあるため、末尾の不完全な部分を削る\r
+ Count = 0;\r
+ while(Count < SrcLength)\r
{\r
- if((unsigned char)*(pSrc + Count + 1) >= 0x40)\r
- Count += 2;\r
- else\r
+ if(((unsigned char)*(pSrc + Count) >= 0x81 && (unsigned char)*(pSrc + Count) <= 0x9f) || (unsigned char)*(pSrc + Count) >= 0xe0)\r
{\r
- if(Count + 2 > SrcLength)\r
- break;\r
- Count += 1;\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
- else\r
- Count += 1;\r
+ SrcLength = Count;\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
+ // サイズ0 or バッファサイズより大きい場合は、\r
+ // cInfo->Bufの最初に'\0'を入れて、\r
+ // cInfo->BufSizeに0を入れて返す。\r
// if( string_length == 0 ||\r
// string_length >= 1024 ){\r
// *(cInfo->Buf) = '\0';\r
return Continue;\r
}\r
\r
- // \92\86\8aÔ\83R\81[\83h(unicode)\82É\95Ï\8a·\r
+ // 中間コード(unicode)に変換\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
+// CP_ACP, // 変換先文字コード\r
+// 0, // フラグ(0:なし)\r
+// cInfo->Str, // 変換元文字列\r
+// -1, // 変換元文字列バイト数(-1:自動)\r
+// (unsigned short *)temp_string, // 変換した文字列の格納先\r
+// 1024 // 格納先サイズ\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
+ // 生成されるUTF-8コードのサイズを調べる\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
+// CP_UTF8, // 変換先文字コード\r
+// 0, // フラグ(0:なし)\r
+// (unsigned short *)temp_string, // 変換元文字列\r
+// -1, // 変換元文字列バイト数(-1:自動)\r
+// NULL, // 変換した文字列の格納先\r
+// 0, // 格納先サイズ\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
+ // サイズ0 or 出力バッファサイズより大きい場合は、\r
+ // cInfo->Bufの最初に'\0'を入れて、\r
+ // cInfo->BufSizeに0を入れて返す。\r
// if( string_length == 0 ||\r
// string_length >= cInfo->BufSize ){\r
// *(cInfo->Buf) = '\0';\r
// return(Continue);\r
// }\r
\r
- // \8fo\97Í\83T\83C\83Y\82ð\90Ý\92è\r
+ // 出力サイズを設定\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
- // \8fo\97Í\95¶\8e\9a\97ñ\82Ì\90æ\93ª\82ÉBOM(byte order mark)\82ð\82Â\82¯\82é\r
+ // ↓付けちゃだめ コマンドにも追加されてしまう\r
+ // 出力文字列の先頭にBOM(byte order mark)をつける\r
*(cInfo->Buf) = (char)0xef;\r
*(cInfo->Buf+1) = (char)0xbb;\r
*(cInfo->Buf+2) = (char)0xbf;\r
*/\r
\r
- // UTF-8\83R\81[\83h\82É\95Ï\8a·\r
+ // UTF-8コードに変換\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
+// CP_UTF8, // 変換先文字コード\r
+// 0, // フラグ(0:なし)\r
+// (unsigned short *)temp_string, // 変換元文字列\r
+// -1, // 変換元文字列バイト数(-1:自動)\r
+// cInfo->Buf, // 変換した文字列の格納先(BOM:3bytes)\r
+// cInfo->BufSize, // 格納先サイズ\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
+ // バッファに収まらないため変換文字数を半減\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
+ // 変換された元の文字列での文字数を取得\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
+ // 変換可能な残りの文字数を取得\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
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
+ // 変換不能なため次の入力の先頭に結合\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
+ cInfo->FlushProc = ConvSJIStoUTF8N;\r
Continue = NO;\r
}\r
\r
\r
return(Continue);\r
}\r
-// UTF-8N\91Î\89\9e \82±\82±\82Ü\82Å\81ª\r
+// UTF-8対応 ここまで↑\r
\r
\r
-/*----- IBM\8ag\92£\8a¿\8e\9a\82ðNEC\91I\92èIBM\8ag\92£\8a¿\8e\9a\93\99\82É\95Ï\8a· -------------------------------\r
+/*----- IBM拡張漢字をNEC選定IBM拡張漢字等に変換 -------------------------------\r
*\r
* Parameter\r
-* code \8a¿\8e\9a\83R\81[\83h\r
+* code 漢字コード\r
*\r
* Return Value\r
-* int \8a¿\8e\9a\83R\81[\83h\r
+* int 漢字コード\r
*----------------------------------------------------------------------------*/\r
static int ConvertIBMExtendedChar(int code)\r
{\r