#include #include #include #include #include #include #include #define TRUE 0 #define FALSE -1 #define UTF8 1208 #define UTF16 1200 #define USA 0 #define JPN 1 #define CHS 2 #define CHT 3 #define KOR 4 #define THA 5 #define DE 6 #define KANA_SU 57 typedef struct { int BYTESPRO; int BYTESAVL; char MSGID[7]; char RESRVD; char EXCPDATA[100]; } ERRSTRUCTURE; /* Define the error return structure */ ERRSTRUCTURE errcode;/* Error Code Structure for RCVMSG */ volatile _INTRPT_Hndlr_Parms_T ca; int bINZSR = FALSE; char ref[133], asc_kana5035[KANA_SU + 1], asc_kana5026[KANA_SU + 1]; int m_bLocale = FALSE; void INZSR(void); int toUTF16(char* ebcbuf, char* unibuf, int CNTRY, int CVTDBCS, int HEXDSP); int setContryCode(int CNTRY); int toDBCS(char* schar, char* DBCS, int* DBLen, int ccsid); int toASCII(char* ascbuf, char* ebcbuf, char* table, char* tbllib, ...); /*************************************************************/ /* IMPORT  変  数 */ /*************************************************************/ /* CNTRY: 国 :0= 米国 1= 日本 2= 中国 3= 台湾 4= 韓国 5= タイ */ /* 6= 独 */ extern int CNTRY; void main(void){ char sBufLocal[128], sBufPDF[128]; int cnvLen; printf("** TESTUTF16C : UTF-16 への変換テスト **\n"); getchar(); strcpy(sBufLocal, " 日本会社 CO,.LTD"); printf(" 文字列 :%s( 長さ %d) を UTF-16 に変換します。 \n", sBufLocal, strlen(sBufLocal)); getchar(); cnvLen = toUTF16(sBufLocal, sBufPDF, CNTRY, TRUE, TRUE); if(cnvLen <= FALSE){/* 変換エラー */ printf("UTF16 変換でエラーが発生しました。 \n"); printf("[%d] 変換元データ :%s\n", __LINE__, sBufLocal); getchar(); exit(-1); }/* 負数 */ sBufPDF[cnvLen] = 0x00; printf(" 変換に成功しました。 ( 変換後の長さ = %d バイト )\n", cnvLen); getchar(); exit(0); } /****************************************************************************/ int toUTF16(char* ebcbuf, char* unibuf, int uCNTRY, int CVTDBCS, int HEXDSP) /****************************************************************************/ /* uCNTRY: 国 :0= 米国 1= 日本 2= 中国 3= 台湾 4= 韓国 5= タイ */ /* 6= 独 7=Shift_JIS */ /* toUTF16 は変換後のバッファーの長さを戻す */ /* CVTDBCS: TRUE= 半角文字があれば全角文字に変換してから */ /* UNICODE に変換する */ /* HEXDSP : TRUE=HEX 形式で文字を出力する */ /* */ /*-------------------------------------------------------------------*/ { int JOB_CCSID; int len, i, j, DBLen, bCNTRY; iconv_t cd; QtqCode_T fromcode, tocode; size_t inbyte, outbyte, rc, bckbyte; char* source, *target, *hexbuf, *DBCSbuf; char hexdsp[3]; if(bINZSR == FALSE) INZSR(); JOB_CCSID = setContryCode(uCNTRY); memset(&fromcode, 0, sizeof(fromcode)); memset(&tocode, 0, sizeof(tocode)); fromcode.CCSID = JOB_CCSID; tocode.CCSID = UTF16; /*(1) 半角文字を倍角に変更する */ if(CVTDBCS == TRUE){/* 倍角に変更 */ len = strlen(ebcbuf); DBCSbuf = (char*)malloc(len * 2 + 2); toDBCS(ebcbuf, DBCSbuf, &DBLen, JOB_CCSID); memcpy(ebcbuf, DBCSbuf, DBLen); free(DBCSbuf); ebcbuf[DBLen] = 0x00; }/* 倍角に変更 */ /*(2) 変換ハンドルを作成 */ cd = QtqIconvOpen(&tocode, &fromcode); if(cd.return_value == FALSE){/* オープン・エラー */ printf("UNI_CODE-ERR[%d] QtqIconvOpen :%s\n", __LINE__, strerror(errno)); return FALSE; }/* オープン・エラー */ source = ebcbuf; target = unibuf; inbyte = strlen(ebcbuf); outbyte = strlen(ebcbuf) * 2; bckbyte = outbyte; /*(3) 変換を実行 */ rc = iconv(cd, &source, &inbyte, &target, &outbyte); if(rc != 0){/* 変換エラー */ printf("UNI_CODE iconv:JOB から UTF-16 への変換でエラーが発生しました。 \n"); printf("UNI_CODE-ERR[%d] iconv :[%d]%s\n",__LINE__,errno,strerror(errno)); iconv_close(cd); getchar(); exit(-1); }/* 変換エラー */ inbyte = strlen(ebcbuf); if(outbyte > bckbyte) outbyte = bckbyte - outbyte; unibuf[(int)outbyte] = 0x00; /*(4) 変換ハンドルをクローズ */ iconv_close(cd); /*(5) HEXDSP 出力 */ if(HEXDSP == TRUE){/* HEXDSP 出力 */ len = (int)outbyte; while(len > 0){/*while*/ if(len > 1 && unibuf[len-1] == 0x00){/* 末尾が NULL */ len --; }/* 末尾が NULL */ else break; }/*while*/ hexbuf = (char*)malloc(len * 2 + 3); #pragma convert(850) hexbuf[0] = '<'; #pragma convert(0) j = 1; bCNTRY = CNTRY; CNTRY = 1; /* 日本 */ for(i = 0; i