;---------- ---------- ---------- ---------- ---------- ; 作成者のURL ---> http://www.setsuki.com/ ;---------- ---------- ---------- ---------- ---------- #include "kernel32.as" ;========== ========== ========== ========== ========== ; 文字コードの変換 ;---------- ---------- ---------- ---------- ---------- ; ; ■ convert p1,p2,p3 ;文字コードを自動判断して書き換える ;   p1 = 結果を書き込む変数名 (SJIS文字列) ;   p2 = 内容を読み出す元の変数名 ;   p3 = 内容を読み出す元の変数のサイズ ; ; ■ var = getcode(p1,p2) ;文字コードを判断する ;   p1 = 内容を読み出す元の変数名 ;   p2 = 内容を読み出す元の変数のサイズ ; ; ■ EUCtoSJIS p1,p2,p3 ;EUC文字列をSJIS文字列に変換 ; ■ JIStoSJIS p1,p2,p3 ;JIS文字列をSJIS文字列に変換 ; ■ BASE64toSJIS p1,p2,p3 ;BASE64文字列をSJIS文字列に変換 ;   p1 = 結果を書き込む変数名 (SJIS文字列) ;   p2 = 内容を読み出す元の変数名 (各文字コードの文字列) ;   p3 = 内容を読み出す元の変数のサイズ ; ; ■ SJIStoEUC p1,p2,p3 ;SJIS文字列をEUC文字列に変換 ; ■ SJIStoJIS p1,p2,p3 ;SJIS文字列をJIS文字列に変換 ; ■ SJIStoBASE64 p1,p2,p3 ;SJIS文字列をBASE64文字列に変換 ;   p1 = 結果を書き込む変数名 (各文字コードの文字列) ;   p2 = 内容を読み出す元の変数名 (SJIS文字列) ;   p3 = 内容を読み出す元の変数のサイズ ; ; ■ SJIStoUTF8 p1,p2 ;BASE64文字列をSJIS文字列に変換 ;   p1 = 結果を書き込む変数名 (UTF8文字列) ;   p2 = 内容を読み出す元の変数名 (SJIS文字列) ; ; ■ UTF8toSJIS p1,p2 ;   p1 = 結果を書き込む変数名 (SJIS文字列) ;   p2 = 内容を読み出す元の変数名 (UTF8文字列) ; ; ■ toCRLF p1,p2 ;1文字改行コードをCR+LFにする ;   p1 = 結果を書き込む変数名 ;   p2 = 内容を読み出す元の変数名 ; ;========== ========== ========== ========== ========== ;[ 使用しないコードは 0 にする ] サイズ減少用 #define global _Jcode_getcode_ 1 #define global _Jcode_EUCtoSJIS_ 1 #define global _Jcode_SJIStoEUC_ 1 #define global _Jcode_JIStoSJIS_ 1 #define global _Jcode_SJIStoJIS_ 1 #define global _Jcode_UTF8toSJIS_ 1 #define global _Jcode_SJIStoUTF8_ 1 #define global _Jcode_Base64toSJIS_ 1 #define global _Jcode_SJIStoBase64_ 1 #define global _Jcode_toCRLF_ 1 #if _Jcode_toCRLF_ == 0 #define global toCRLF(%1,%2,%3) : #endif #define global convert(%1,%2,%3) Jcode_chk = getcode(%2,%3) : if(Jcode_chk=Jcode_EUC){ EUCtoSJIS %1,%2,%3 } else { if(Jcode_chk==Jcode_JIS){ JIStoSJIS %1,%2,%3 } else { %1 = %2 } } toCRLF %1,%2 #enum global Jcode_SJIS = 1 #enum global Jcode_EUC #enum global Jcode_JIS #module #if _Jcode_getcode_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SJIS, JIS, EUC 判別 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #defcfunc getcode var buf, int flen #define s_chk flag #define e_chk len code_jis=0 code_sjis=0 : s_chk=0 code_euc=0 : e_chk=0 //文字コードを判別する repeat flen //JISチェック a = peek(buf,cnt) : if a=27 : code_jis=1 : break //EUCチェック if e_chk/10>0 { e_chk=0 : if (a>160)&(a<255) : code_euc+=3 } else { if e_chk\10>0 { if e_chk=1&(a>160)&(a<255) : code_euc+=2 if e_chk=2&(a>160)&(a<224) : code_euc+=2 if e_chk=3&(a>160)&(a<255) : e_chk=20 if e_chk!20 : e_chk=0 } else { if (a>160)&(a<255) : e_chk=1 if (a=142)|(a=143) : e_chk=a-140 } } //S-JISチェック if s_chk>0 { if (a> 64)&(a<126)|((a>127)&(a<253)) : code_sjis+=2 s_chk=0 } else { if (a>128)&(a<160)|((a>223)&(a<253)) : s_chk=1 } loop if( code_jis == 1 ): return Jcode_JIS if( code_euc > code_sjis ): return Jcode_EUC return Jcode_SJIS #endif #if _Jcode_EUCtoSJIS_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; EUC -> SJISコードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc EUCtoSJIS var sjis, var buf, int flen flag = 0 : len = 0 : i = 0 : b = 0 memexpand sjis, flen *@ if( i >= flen ): goto *@f a = peek(buf,i) : i++ if( a >= 0x80 ){ b = peek(buf,i) : i++ //第2バイトの変換 if( a\2 == 0 ): b-=0x02 : else : b-=0x61 : if( b > 0x7e ): b++ //第1バイトの変換 a++ : a/=2 : if( a < 0xdf ): a+=0x30 : else : a+=0x70 wpoke sjis, len, (b<<8)|a : len+=2 b = 0 : goto *@b } //同じ変数を指定した場合、おかしくなるので削除 //1バイト改行の変更(CR) /*if( a != 0x0A )&&( b == 0x0D ){ poke sjis, len, 0x0A : len++ } //1バイト改行の変更(LF) if( a == 0x0A )&&( b != 0x0D ){ wpoke sjis, len, 0x0A0D : len+=2 b = a : goto *@b }*/ //ASCIIコード poke sjis, len, a : len++ b = a : goto *@b *@ poke sjis,len,0 return #endif #if _Jcode_JIStoSJIS_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; JIS -> S-JISコードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc JIStoSJIS var sjis, var buf, int flen flag = 0 : len = 0 : i = 0 : b = 0 memexpand sjis, flen *@ if( i >= flen ): goto *@f a = peek(buf,i) : i++ if( a == 0x1B ){ a = wpeek(buf,i) : b = peek(buf,i+2) if( a == 0x4026 )&&( b == 0x1B )&&( peek(buf,i+3) == 0x4224 ){ i+=5 : flag^=1 } else { if( a == 0x2824 )&&( b == 0x44 ){ i+=3 : flag^=1 } else { if( a == 0x4228 )||( a == 0x4A28 )||( a == 0x4928 )||( a == 0x4024 )||( a == 0x4224 ){ i+=2 : flag^=1 }}} b = 0 : goto *@b } if( flag ){ b = peek(buf,i) : i++ //第2バイトの変換 if( a\2 == 0 ): b+=0x7d : else : b+=0x1f if( b > 0x7e ): b++ //第1バイトの変換 a++ : a/=2 : if( a < 0x5f ): a+=0x70 : else : a+=0xb0 wpoke sjis, len, (b<<8)|a : len+=2 goto *@b } //同じ変数を指定した場合、おかしくなるので削除 //1バイト改行の変更(CR) /*if( a != 0x0A )&&( b == 0x0D ){ poke sjis, len, 0x0A : len++ } //1バイト改行の変更(LF) if( a == 0x0A )&&( b != 0x0D ){ wpoke sjis, len, 0x0A0D : len+=2 b = a : goto *@b }*/ //ASCIIコード poke sjis, len, a : len++ b = a : goto *@b *@ poke sjis,len,0 return #endif #if _Jcode_SJIStoEUC_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SJIS -> EUC コードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc SJIStoEUC var buf, var sjis, int flen flag = 0 : len = 0 : i = 0 : b = 0 memexpand buf, flen *@ if( i >= flen ): goto *@f a = peek(sjis,i) : i++ if( a >= 0x81 ){ b = peek(sjis,i) : i++ //第1バイトの変換 if( a < 0xa0 ): a = (a-0x81)*2+0xA1 : else : a = (a-0xe0)*2+0xDF //第2バイトの変換+a if( b < 0x9f ){ if( b > 0x7f ){ b-- } b += 0x61 } else { a++ : b += 2 } wpoke buf, len, (b<<8)|a : len+=2 goto *@b } //ASCIIコード poke buf, len, a : len++ b = a : goto *@b *@ poke buf,len,0 return #endif #if _Jcode_SJIStoJIS_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; S-JIS -> JISコードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc SJIStoJIS var buf, var sjis, int flen flag = 0 : len = 0 : i = 0 : b = -1 tmp = "" : memexpand tmp, flen*2 *@ if( i >= flen ): goto *@f a = peek(sjis,i) : i++ if( a >= 0x81 ){ if( b == -1 ){ lpoke tmp, len, 0x42241B : len += 3 } b = peek(sjis,i) : i++ if ( a >= 0xe0 ) { a -= 0x40 } if ( b >= 0x80 ) { b -= 1 } if ( b >= 0x9e ) { a = (a - 0x70) * 2 : b -= 0x7d } else { a = ((a - 0x70) * 2) - 1 : b -= 0x1f } wpoke tmp, len, (b<<8)|a : len+=2 goto *@b } if( b != -1 ){ lpoke tmp, len, 0x42281B : len += 3 } //ASCIIコード poke tmp, len, a : len++ b = -1 : goto *@b *@ poke tmp, len, 0 memexpand buf, len : buf = tmp return #endif #if _Jcode_Base64toSJIS_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; BASE64 -> SJISコードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc BASE64toSJIS var sjis, var buf, int flen flag = 0 : len = 0 : i = 0 : b = 0 memexpand sjis, flen *@ if( i >= flen ): goto *@f a = peek(buf, i) : i++ if( a == 0 )||( a == '=' ): goto *@f if( a == '+' ): a = 62 if( a == '/' ): a = 63 if( a >= 'A' )&&( a <= 'Z' ){ a -= 65 } else { if( a >= 'a' )&&( a <= 'z' ){ a -= 71 } else { if( a >= '0' )&&( a <= '9' ){ a += 4 }}} if( b <= 0 ): b = 6 : flag = a << 2 : goto *@b b -= 2 poke sjis, len, flag | ( a >> b ) : len++ flag = a << ( 8 - b ) goto *@b *@ poke sjis, len, 0 return #endif #if _Jcode_SJIStoBase64_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SJIS -> BASE64コードに変換 ; http://hsp.tv/play/pforum.php?mode=pastwch&num=26076 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc SJIStoBASE64 var buf, var sjis, int flen encodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" dim decodeTable, 256/4 : memset decodeTable, 128, 256 repeat 26 : poke decodeTable, 'A'+cnt, cnt : loop repeat 26 : poke decodeTable, 'a'+cnt, cnt+26 : loop repeat 10 : poke decodeTable, '0'+cnt, cnt+52 : loop poke decodeTable, '+', 62 poke decodeTable, '/', 63 poke decodeTable, 13, 129 poke decodeTable, 10, 129 poke decodeTable, '=', 254 poke decodeTable, 0, 255 mref destIndex,64 dest="": memexpand dest,(flen+2)/3*4+(flen+2)/3*4/76*2+1 srcIndex=0 : destIndex=0 repeat flen/3 rdata = peek(sjis, srcIndex)<<16 | peek(sjis, srcIndex+1)<<8 | peek(sjis, srcIndex+2) poke dest, destIndex, peek(encodeTable, rdata>>18) poke dest, destIndex+1, peek(encodeTable, rdata>>12&63) poke dest, destIndex+2, peek(encodeTable, rdata>>6&63) poke dest, destIndex+3, peek(encodeTable, rdata&63) srcIndex+=3 : destIndex+=4 loop if flen\3 > 0 { rdata = peek(sjis, srcIndex) poke dest, destIndex, peek(encodeTable, rdata>>2) if flen\3==1{ poke dest, destIndex+1, peek(encodeTable, rdata<<4&63) wpoke dest, destIndex+2, 0x3d3d ;'==' }else{ rdata = (rdata&3)<<8 | peek(sjis, srcIndex+1) poke dest, destIndex+1, peek(encodeTable, rdata>>4) poke dest, destIndex+2, peek(encodeTable, rdata<<2&63) poke dest, destIndex+3, '=' } destIndex+=4 } poke dest, destIndex, 0 : buf = dest return #endif #if _Jcode_SJIStoUTF8_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SJIS -> UTF-8Nコードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc SJIStoUTF8 var utf, var sjis #define CP_UTF8 65001 ;バッファに必要なサイズを調べる ;MultiByteToWideChar 932,0,varptr(sjis),-1,0,0 : len = stat len = strlen(sjis) : sdim uni, len*2 ;一度UniCodeに変換 MultiByteToWideChar 932,0,varptr(sjis),-1,varptr(uni),len ;バッファに必要なサイズを調べる WideCharToMultiByte 65001,0,varptr(uni),len,0,0,0,0 len = stat : memexpand utf, len+1 ;UTF-8に変換 WideCharToMultiByte 65001,0,varptr(uni),len,varptr(utf),len,0,0 return #endif #if _Jcode_UTF8toSJIS_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; UTF-8N -> SJISコードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc UTF8toSJIS var sjis, var utf ;バッファに必要なサイズを調べる MultiByteToWideChar 65001,0,varptr(utf),-1,varptr(uni),0 len = stat : sdim uni,len*2 ;一度UniCodeに変換 MultiByteToWideChar 65001,0,varptr(utf),-1,varptr(uni),len ;バッファに必要なサイズを調べる WideCharToMultiByte 932,0,varptr(uni),-1,varptr(sjis),0,0,0 len = stat : memexpand sjis, len+1 ;UTF-8に変換 WideCharToMultiByte 932,0,varptr(uni),-1,varptr(sjis),stat,0,0 return #endif #if _Jcode_toCRLF_ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 改行を変更 (CR/LF -> CR+LF) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc toCRLF var sjis, var buf sdim ans, 1 : i = 0 : b = 0 *@ a = peek(buf, i) //1バイト改行の変更(CR) if( a != 0x0A )&&( b == 0x0D ){ ans += '0x0A' } //1バイト改行の変更(LF) if( a == 0x0A )&&( b != 0x0D ){ ans += "\n" //改行以外の文字 } else { ans += strmid(buf, i, 1) } if( a == 0 ){ sjis = ans : sdim ans, 1 : return } b = a : i++ : goto *@b #endif ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #global