これは文字コードをEUCからSJISへ変換するスクリプトです。
エラー処理は特にしていません。ソースコードを読んだ上でお使いください。
このスクリプトの改変・再配布等は自由です。
Option Explicit Class KUTENCode Private kuCode,tenCode Public Property Let ku(value) If value>=1 and value<=120 Then kuCode=Cbyte(value) Else Err.Source="クラス KUTENCode" Err.Description="区番号が範囲外です。区番号は1〜120の範囲で指定してください。" Err.Raise 5021 End If End Property Public Property Get ku ku=kuCode End Property Public Property Let ten(value) If value=>1 and value<=94 Then tenCode=Cbyte(value) Else Err.Source="クラス KUTENCode" Err.Description="点番号が範囲外です。点番号は1〜94の範囲で指定してください。" Err.Raise 5021 End If End Property Public Property Get ten ten=tenCode End Property Function toJIS() 'jis1stを左へ8ビットシフトしてjis2ndを加える toJIS=(ku+&H20) * &H100 Or ten+&H20 End Function Function toCharAsJIS() toJIS=Chr(ku+&H20) & Chr(ten+&H20) End Function Function toSJIS() Dim sjis1st,sjis1st_base Dim sjis2nd,sjis2nd_base '1区〜62区の場合 If ku<63 Then sjis1st_base=&H80 '63区以降の場合 Else sjis1st_base=&HC0 End If '偶数区の場合 If ku Mod 2=0 Then sjis2nd_base=&H9E '奇数区の場合 Else '1点〜63点の場合 If ten<64 Then sjis2nd_base=&H3F '64点〜94点の場合 Else sjis2nd_base=&H40 End If End If sjis1st=sjis1st_base+(ku+1)\2 sjis2nd=sjis2nd_base+ten 'sjis1stを左へ8ビットシフトしてsjis2ndを加える toSJIS=sjis1st * &H100 Or sjis2nd End Function Function toChr() toChr=Chr(toSJIS()) End Function Function toEUC() 'euc1stを左へ8ビットシフトしてeuc2ndを加える toEUC=(ku+&HA0) * &H100 Or ten+&HA0 End Function Function toCharAsEUC() toCharAsEUC=Chr(ku+&HA0) & Chr(ten+&HA0) End Function Sub fromChr(char) Dim tmpChar Dim sjis1st,sjis2nd tmpChar=Clng("&H" & Hex(Asc(char))) 'tmpCharはlong型(符号付き32ビット)ただし下位16ビット部分だけ使い、符号なし16ビットとして扱う '右8ビットシフト sjis1st=tmpChar \ &H100 '先頭8ビットをマスクして消す sjis2nd=tmpChar Or &HFF00 Xor &HFF00 fromSJIS sjis1st,sjis2nd End Sub Sub fromJIS(jis1st,jis2nd) ku=jis1st-&H20 ten=jis2nd-&H20 End Sub Sub fromSJIS(sjis1st,sjis2nd) Dim sjis1st_base,sjis1st_capital Dim sjis2nd_base '偶数区の場合 If sjis2nd > &H9E Then sjis1st_capital=0 sjis2nd_base=&H9E '奇数区の場合 Else sjis1st_capital=1 '1点〜63点の場合 If sjis2nd < &H7F Then sjis2nd_base=&H3F '64点〜94点の場合 Else sjis2nd_base=&H40 End If End If '1区〜62区の場合 If sjis1st < &HA0 Then sjis1st_base=&H80 '63区以降の場合 Else sjis1st_base=&HC0 End If ku=(sjis1st-sjis1st_base)*2-sjis1st_capital ten=sjis2nd-sjis2nd_base End Sub Sub fromEUC(euc1st,euc2nd) ku=euc1st - &HA0 ten=euc2nd -&HA0 End Sub Sub fromKANA(kanaCode) If kanaCode<1 Or kanaCode>63 Then Err.Source="クラス KUTENCode" Err.Description="codeの値が範囲外です。カナコードは1〜63の範囲で指定してください。" Err.Raise 5021 Else fromChr Mid("。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛°",kanaCode,1) End If End Sub End Class Class KANACode Private kanaCode Public Property Let code(value) If value>=1 and value<=63 Then kanaCode=Cbyte(value) Else Err.Source="クラス KANACode" Err.Description="codeの値が範囲外です。カナコードは1〜63の範囲で指定してください。" Err.Raise 5021 End If End Property Public Default Property Get code code=kanaCode End Property Function toJIS toJIS=code+&H20 End Function Function toSJIS toSJIS=code+&HA0 End Function Function toChr toChr=Chr(toSJIS()) End Function Function toEUC toEUC=&H8E00 Or code+&HA0 End Function Sub fromJIS(charCode) code=charCode-&H20 End Sub Sub fromSJIS(charCode) code=charCode-&HA0 End Sub Sub fromChr(char) Dim tmpChar tmpChar=Clng("&H" & Hex(Asc(char))) 'tmpCharはlong型(符号付き32ビット)ただし下位16ビット部分だけ使い、符号なし16ビットとして扱う fromSJIS tmpChar End Sub Sub fromEUC(euc1st,euc2nd) code=euc2nd-&HA0 End Sub End Class
<job id="EUCtoSJIS"> <script language="VBScript" src="文字コード.vbs"/> <script language="VBScript"> '文字コードをEUCからSJISへ変換するスクリプト '制作者 clone_01@yahoo.co.jp '最終更新 午後 05:00 00/11/10 '使用上の注意 'このスクリプトを使った事により発生したいかなる損害についても制作者は一切責を負いません。 ' ソースコードを読んだ上で、自己責任において使ってください。 ' 'このスクリプトの実行には 文字コード.vbs が必要です。 ' 同じフォルダに文字コード.vbsをおくか、src属性を書き換えてパスを通してください。 ' '文字コードの自動判別機能は付いていません。 ' EUC以外のコードで保存されたファイルを変換すると意味不明な文字列になります。(^^; ' '元になるファイルのサイズ(単位:バイト)が奇数の場合は一時的に作業用ファイルを生成します。 ' これはユニコードとしてファイルからデータを読み込むためファイルサイズが奇数だと最後の1バイトが読み込めないので、 ' 作業用ファイルの最後尾にスペース(ASCIIコード)を付加し、ファイルのサイズを偶数にするからです。 ' '実行後に スクリプトと同じフォルダに "SJIS_元のファイル名.txt" という名前のファイルを生成します。 ' 同名のファイルがあった場合は上書きします。 ' 'ファイルサイズが大きいと処理できない事があります。 ' ReadAllでデータを全部読み込んでいるからです。 '使い方 'EUCのテキストファイルをこのスクリプトのアイコンにドラッグ&ドロップするだけ。 '処理が終わると"完了"のメッセージボックスがでます。 Option Explicit Dim WshShell Dim i For i = 0 to WScript.Arguments.Count - 1 ConvertEUCtoSJIS WScript.Arguments(i) Next Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.AppActivate "EUCtoSJIS.wsf" MsgBox "変換完了",vbOKOnly,"EUCtoSJIS" 'ファイルの操作、改行文字の置換はこのプロシージャで処理する。 Sub ConvertEUCtoSJIS(filePath) Const ForReading = 1, ForWriting = 2, ForAppending = 8 Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 Const TMP_FILE_NAME="TMP_EUCtoSJIS.tmp" Dim fso,file,textStream Dim fName,fPath Dim oddFlg,tmpStr 'メモ帳をひらいて表示する場合 Dim WshShell Set fso = CreateObject("Scripting.FileSystemObject") Set file=fso.GetFile(filePath) '名前を取得しておく fName=file.Name fPath="SJIS_" & file.Name If file.size>0 Then 'ファイルサイズが奇数の場合はテンポラリファイルにコピーし、ファイルの最後尾にスペース(ASCIIコード)を付加する If file.size mod 2 =1 Then file.Copy TMP_FILE_NAME,True Set file=fso.GetFile(TMP_FILE_NAME) Set textStream = file.OpenAsTextStream(ForAppending,TristateFalse) textStream.Write Chr(&H20) textStream.Close oddFlg=True Else oddFlg=False End If 'ユニコードで文字列取得 Set textStream = file.OpenAsTextStream(ForReading,TristateTrue) tmpStr=textStream.ReadAll textStream.Close If oddFlg Then file.Delete 'EUCからSJISへ変換 tmpStr = EUCtoSJIS(tmpStr,oddFlg) '改行文字をそろえる。 tmpStr = replaceMatches(tmpStr,"(?!\r)\n|\r(?!\n)|\r\n",vbNewLine) End If 'ASCIIファイルとしてデータを保存。 Set textStream=fso.CreateTextFile(fPath,True,TristateFalse) textStream.Write tmpStr textStream.Close 'メモ帳を開いて表示する。 Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run ("notepad.exe " & fPath) 'ワードパッドの場合 'WshShell.Run ("wordpad.exe " & fPath) End Sub '汎用正規表現置換関数(サンプルコードをパクっただけ^^; Function replaceMatches(mainStr,patrn, replaceStr) Dim regEx ' 変数を作成します。 Set regEx = New RegExp ' 正規表現を作成します。 regEx.Pattern = patrn ' パターンを設定します。 regEx.Global = True ' 文字列全体を検索するように設定します。 replaceMatches = regEx.Replace(mainStr,replaceStr) ' 置換を実行します。 End Function Function getByte(mainStr,index) getByte=AscB(MidB(mainStr,index,1)) index=index+1 End Function '変換関数 Function EUCtoSJIS(mainStr,oddFlg) Dim length,bufStr,index,tmpStr Dim kuten,kana Dim char1st,char2nd Set kuten=new KUTENCode Set kana=new KANACode length=lenB(mainStr) If oddFlg Then length=length-1 index=1 Do While index<=length char1st=getByte(mainStr,index) If char1st<&H20 Or char1st=&H7F Then '制御コード tmpStr=Chr(char1st) ElseIf char1st<&H7F Then 'ASCII文字/JISローマ字 tmpStr=Chr(char1st) ElseIf char1st>&HA0 And char1st<&HFF Then '漢字 第一バイト '第二バイトを取得 If index<=length Then char2nd=getByte(mainStr,index) If char2nd>&HA0 And char2nd<&HFF Then '漢字 第二バイト kuten.fromEUC char1st,char2nd tmpStr=kuten.toChr() Else'不正な文字コード tmpStr="%" & Hex(char1st) index=index-1 '再検討 End If Else '不正な文字コード tmpStr="%" & Hex(char1st) End If ElseIf char1st=&H8E Then 'SS2(半角カナ) If index<=length Then char2nd=getByte(mainStr,index) If char2nd > &HA0 And char2nd < &HE0 Then kana.fromEUC char1st,char2nd tmpStr=kana.toChr() Else'不正な文字コード tmpStr="%SS2%" & Hex(char2nd) End If Else '不正な文字コード tmpStr="%SS2" End If ElseIf char1st=&H8F Then 'SS3(補助漢字) '手抜きです(^^; tmpStr="■" index=index+2 Else '不正な文字コード tmpStr="%" & Hex(char1st) End If bufStr=bufStr & tmpStr Loop EUCtoSJIS=bufStr End Function </Script> </Job>
もどる |
(◎←) ((( ▽ ))) - - |
This page hosted by
Get your own Free Home Page