pyukiwiki019〜wikiファイルのローカルでの管理ツール

  • pyukiwiki019では,各ページの内容は,ページ名をEUCコードで表したファイル名のテキストファイルで「wiki」フォルダに保存されます。
  • このファイル,pyukiwiki上ではもちろんちゃんと(日本語などの)ページ名で開いたり編集したりできるのですが,特にイントラネットなどでpyukiwikiを運用している場合に,各wikiファイルの中身をローカルから直接確かめたり,ページのコピーを手っ取り早くローカルから行ったりしたい場合には,エクスプローラではEUCのファイル名からページ名の見当が付かず困ってしまいます。
  • と,いうことで,とりあえず簡単なEXCELのVBAを使ってファイル名のリストをSJISのページ名リストに変換するツールを試作してみました。

EUCコード列をSJISの文字列に変換するルーチン

  • ツールの心臓部は,EUCコード列をSJISの文字列に変換するルーチン。これのシンプルなのが以外にweb上に落ちていないんですよね。(探し方が悪いのかもしれませんが)
  • というか,あるにはあるのですが,テキストファイル全文のコード変換用で洗練されすぎていたり,「ADODB.Streamを使用し・・・」とか「NKF32.DLL で文字コード変換・・・」とかの高度な方法でいまいち使い方がわからないとか・・・。融通の利く,処理の中身が見えるプロシージャがなかなか見当たらないのです。
  • で,いつもお世話になっている「三流君 VBAで楽しくプログラミング」のページを訪ねてみると,三流君らしく(?)VBAの一般的な命令のみでゴリゴリと変換するタイプのサンプルがいくつか紹介されており,いい感じ。ただ,目当てのEUCの「コード」からSJISの「文字列」に変換するのはなかった(逆はあった)ので,そこにリンクされていた「JIS, EUC, SJIS の漢字コードについて」という,EUC,JIS,SJISのコード系の相互関係についての説明と,JISからEUCに変換するアルゴリズムの例とを参考に,プログラムを自作してみました。

EXCEL VBAでの,EUCコード→SJIS文字列変換自作関数

  • 変換元のEUCコードのうち2バイトコードについては,「JIS, EUC, SJIS の漢字コードについて」の記述でJIS→SJISの例しかアルゴリズムが載っておらず,EUCから直接変換する方法を改めて考えるのが面倒だったので,EUCとは番地がそのままずれただけの関係にあるJISに一旦変換し,それをSJISに変換する方法を採用。
  • EUCの1バイトコードについては直接SJISに変換しています。

 Public Function EUCtoSJIS(EUCc As String)
    Dim SJISm As String
    Dim mojisu As Integer, i As Integer
    Dim byt As Long, JIS_EUC_diff As Long, bytL As Long, bit1 As Integer
 
    mojisu = Len(EUCc)
    SJISm = ""
    If Int(mojisu / 2) <> mojisu / 2 Then
        MsgBox "EUCはは8bitの倍数(整数バイト)ではありません"
        Exit Function
    End If
    i = 1
    
    JIS_EUC_diff = &HA1 - &H21  'EUCとJISの漢字上位・下位バイト差
    
    
 
    Do While i <= mojIsu
        byt = CLng("&h" & Mid(EUCc, i, 2))
        If byt >= &H0 And byt <= &H7F Then '半角
            sjisM = sjisM & Chr(byt)
            i = i + 2
        ElseIf byt = &H8E Then '続くバイトが半角かな
            i = i + 2
            byt = CLng("&h" & Mid(EUCc, i, 2))
            sjisM = sjisM & Chr(byt)
            i = i + 2
        ElseIf byt >= &HA1 And byt <= &HFE Then '漢字
            i = i + 2
            bytL = CLng("&h" & Mid(EUCc, i, 2))
            'JISの2バイトに変換
            byt = byt - JIS_EUC_diff
            bytL = bytL - JIS_EUC_diff
            
            'SJISへの変換
            
            bit1 = 0
            '上位ビット処理
            byt = byt - &H21
            If Int(byt / 2) <> byt / 2 Then bit1 = 1 '最下位ビット=1
            byt = Int(byt / 2) '上位7ビットの取り出し
            If byt >= &H0 And byt <= &H1E Then
                byt = byt + &H81
            Else
                byt = byt + &HC1
            End If
            '下位ビット処理
            If bit1 = 0 Then
                bytL = bytL + &H1F
                If bytL >= &H7F And bytL <= &H9D Then
                    bytL = bytL + 1
                End If
            Else
                bytL = bytL + &H7E
            End If
            
            sjisM = sjisM & Chr(byt * 256 + bytL)
            i = i + 2
        End If
    Loop
    
    EUCtoSJIS = SJISm
 
 End Function

wikiファイルリストのページ名への変換

  • EUCコード→SJIS文字列変換関数ができれば,あとはVBAのDir関数でリストアップしたEUCコード列のファイル名一覧の各行を前記関数でページ名に変換するようにすればOK

 Sub pyukiwiki019()
    Dim myFile As String, baseDir As String
    Dim i As Integer
    baseDir = "N:\cgi-bin\pyukiwiki019\wiki\"
    myFile = Dir("N:\cgi-bin\pyukiwiki019\wiki\*.txt")
    i = 1
    With Worksheets("pyukiwiki019")
    Cells.ClearContents
    .Cells(1, 1) = "ファイル名"
    .Cells(1, 3) = "ページタイトル"
    Do While myFile <> ""
        .Hyperlinks.Add _
            Anchor:=.Cells(i + 1, 1), _
            Address:=baseDir & myFile, _
            TextToDisplay:=myFile
            myFile = Replace(myFile, ".txt", "")
            .Cells(i + 1, 3) = EUCtoSJIS(myFile)
            
        myFile = Dir()
        i = i + 1
    Loop
    End With
 End Sub

Counter: 1876, today: 2, yesterday: 1


Last-modified: 2019-02-12