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接続してやりましょう」と簡単なサンプルを作って確認しましょう。
ということで、
大まかなプログラムの流れは、
-
dbfをOLEDB読み込む
-
RecordSetをDataGridViewに表示
-
SJISに出力(単純にcopy)
-
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でみると
UTF変換後のdbf
うまくいっている場合もあり、そうでない場合もありで、 なぜなのか わからない状態です。
QGIS1.8での日本語の不具合を直して、QGISで変換した方が早いけど。。。
ここまできたら、shpDBFeditorに組み込めれば、利用の幅も増える気がしているのですが。
DBFeditorサンプルコード
ここに、サンプルコードをアップします。vb.net2010で作成しています。
どなたか、わかる方いらっしゃれば、是非ご教示お願いします。
こちらからダウンロードできます。
文字コードは本当に面倒くさいですよね。
最近のコメント