私は C# と .NET 3.5 を使用しており、Microsoft dBase Driver で ODBC を使用して古い dbf ファイルからデータをインポートしようとしています。
dbf は dBase III 形式で、文字列に ibm850 エンコーディングを使用しています。
今、自分のマシンでプログラムを実行すると、OdbcDataReader から読み取られたすべての文字列データが UTF-16 または UTF-8 などに変換されて出力され、idk でそれを UTF-8 として保存するとすべて問題ありませんが、 XP ボックスでこのプログラムを使用すると、一部の文字が正しく UTF-8 に変換されません。たとえば「Õ」。他にもあるかもしれません。「Ä」、「Ö」、「Ü」などの文字は問題ありません。これが問題です。おそらく、ODBC またはドライバーは、マシン カルチャ情報または何かを使用してすべてを台無しにします。
データベースから文字列をバイナリとして読み取ることは可能ですか? たぶん、CONVERT や CAST のようないくつかの関数でしょうか? または、この dBase ドライバーまたは他のドライバーで機能する SQL 関数と構文のリファレンスはどこにありますか? 私は周りを探しましたが、何も見つかりませんでした。ODBC と SQL を使用していると、目がくらんでしまいます。
現在、すべての σ を Õ に置き換える一時的なハックを使用しています。
ありがとう!
コード例:
System.Data.Odbc.OdbcConnection oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};DriverID=277;Dbq=" + dbPath + ";";
oConn.Open();
System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT name FROM " + dbPath + "TABLE.DBF";
System.Data.Odbc.OdbcDataReader reader = oCmd.ExecuteReader();
reader.Read();
byte[] buf = Encoding.UTF8.GetBytes(reader.GetString(0));
BinaryWriter writer = new BinaryWriter(File.Open(@"C:\DBF\Test.txt", FileMode.Create));
writer.Write(buf);
結果:
dbf の E5 (850 の Õ)
pc1 の Test.txt: C3 95 (UTF-8 の Õ)
pc2 の Test.txt: CF 83 (UTF-8 の σ)