Monthly Archives: 11月 2012 - Page 12

dbfをSJISからUTF8に文字コード変換

dbfをSJISからUTF8に文字コード変換

ExcelGISで山林情報の管理にも書いているのですが、ExcelGISの属性テーブル編集から、DBFの編集部分を抜き出しshpDBFeditorソフトを作成して、ベクターに登録を行っています。

これを、ちょいと手を加えて「どうせならSJISからUTF8に変換すればいいじゃん!!」と考えて、手を加えたのだが、うまく変換されないんですね。これが。
本当に参ってます。

文字コード変換program

単純にDBFの書き出しの部分にfunction SJIS2UTF関数をかましてみましたが、うまくいかず。。。
その問題のSJIS2UTF関数はこんな感じ、

    Private Function SJIS2UTF(ByVal beforeStr As String) As String
        'utf8に文字コード変換
        '----------------------------------
        If (beforeStr.Length Mod 2) <> 0 Then
            'beforeStr = beforeStr & "  " '文字数が奇数の時は空白文字を付けたす
            beforeStr = beforeStr & vbNullString  '文字数が奇数の時はnull文字を付けたす
        End If
        '----------------------------------
 
        Dim utfEnc = System.Text.Encoding.UTF8
        Dim sjisEnc = System.Text.Encoding.GetEncoding(932)
        Dim afterBytes() As Byte = sjisEnc.GetBytes(beforeStr)
        Dim afterStr As String = sjisEnc.GetString(afterBytes)
 
        Dim reverseBytes() As Byte = utfEnc.GetBytes(afterStr)
 
        SJIS2UTF = sjisEnc.GetString(reverseBytes).Trim()
 
    End Function

ネットで投稿質問したりして、ご教示頂いた方には感謝します。

見た目は、簡単で、フォーム上でtextboxとかに入れてみてもちゃんと変換できている。
しかし、これを使うと日本語が途中だけおかしくなる???

それでは、「MapWinGISを使わずにOLEDBでdbf接続してやりましょう」と簡単なサンプルを作って確認しましょう。 
ということで、

blog.godo-tys.jp_wp-content_gallery_dbf_image01.jpg
サンプルdbf読み込み

大まかなプログラムの流れは、

  1. dbfをOLEDB読み込む
  2. RecordSetをDataGridViewに表示
  3. SJISに出力(単純にcopy)
  4. UTF8に出力

たったこれだけなんですけどね。

書き込むcodeは、至ってsimpleでして

    'UTF8に変換してDBF作成
    Private Function saveDBF2UTF(ByVal filePath As String,
                                 ByVal fileName As String) As Boolean
 
        'filePath : dbfファイルがあるディレクトリパス(ファイル名を含まない)
        'fileName : dbfファイル名
 
        Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                         "Data Source=" & filePath & ";" & _
                                         "Extended Properties=DBASE IV;"
 
        Dim i As Integer 'Row
        Dim j As Integer 'Col
 
        Dim oCn As ADODB.Connection
        Dim oRs As ADODB.Recordset
 
        oCn = New ADODB.Connection
        oRs = New ADODB.Recordset
        oCn.Open(ConnectionString)
 
        Dim strSQL As String = "Select * From " & fileName
        oRs.Open(strSQL, oCn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)
 
        For i = 0 To DataGridView1.Rows.Count - 1
            oRs.AddNew()
            For j = 0 To DataGridView1.Columns.Count - 1
                If oRs.Fields(j).Type = ADODB.DataTypeEnum.adInteger Then   '整数
                    oRs.Fields(j).Value = Double.Parse(DataGridView1.Rows(i).Cells(j).Value.ToString)
                ElseIf oRs.Fields(j).Type = ADODB.DataTypeEnum.adDouble Then    '実数
                    oRs.Fields(j).Value = Double.Parse(DataGridView1.Rows(i).Cells(j).Value.ToString)
                Else    '文字
 
                    Console.WriteLine(SJIS2UTF(DataGridView1.Rows(i).Cells(j).Value.ToString))
 
                    oRs.Fields(j).Value = SJIS2UTF(DataGridView1.Rows(i).Cells(j).Value.ToString)
                End If
            Next j
 
            oRs.Update()
 
        Next i
 
        oRs.Close()
        oCn.Close()
        oRs = Nothing
        oCn = Nothing
 
        saveDBF2UTF = True
 
    End Function

な感じで、出力時の文字コードを先のSJIS2UTF関数をかましているだけです。

ここでは、MapWinGISのtutorialでの神奈川県のc14_region.dbfを使っています。
他のdbfでは試していませんが、たぶん化けるんじゃないでしょうか?

dbfファイルをADODBでやろうとしているからまずい? もしかしたら、DAOでないとだめなのか?
ちょいとつまづいています。

ちなみに、OpenOfficeのcalcでみると
blog.godo-tys.jp_wp-content_gallery_dbf_image02.jpg
UTF変換後のdbf

うまくいっている場合もあり、そうでない場合もありで、 なぜなのか わからない状態です。

QGIS1.8での日本語の不具合を直して、QGISで変換した方が早いけど。。。
ここまできたら、shpDBFeditorに組み込めれば、利用の幅も増える気がしているのですが。

DBFeditorサンプルコード

ここに、サンプルコードをアップします。vb.net2010で作成しています。
どなたか、わかる方いらっしゃれば、是非ご教示お願いします。
こちらからダウンロードできます。

文字コードは本当に面倒くさいですよね。

Social Widgets powered by AB-WebLog.com.