0

私は 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 の σ)

4

4 に答える 4

2

このコードを試してください。

var oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + dbPath;
oConn.Open();
var oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT name FROM " + dbPath + "TABLE.DBF";
var reader = oCmd.ExecuteReader();
reader.Read(); 
byte[] A = Encoding.GetEncoding(Encoding.Default.CodePage).GetBytes(reader.GetString(0));
string p = Encoding.Unicode.GetString((Encoding.Convert(Encoding.GetEncoding(850), Encoding.Unicode, A)));
于 2011-05-03T06:36:53.967 に答える
2

これらのファイルにまだ問題がある場合は、私がお手伝いできるかもしれません。

ファイルのオフセット 29 (10 進数) にある「コードページ バイト」、別名「言語ドライバー ID」(LDID) には何が含まれていますか?

ほぼすべてのフィールド データ型とほぼすべてのコードページを読み取ることができる Python ベースの DBF リーダーがあります。これには、コードページ バイトからコードページ番号へのマッピングのさまざまなソースからコンパイルされた長いリストがあります。オプションは、(1) LDID を信じる、Unicode を配信する、(2) LDID を無視する、デコードされていないバイトを配信する、(3) LDID をオーバーライドする、特定のコードページで Unicode にデコードする、です。もちろん、Unicode は UTF-8 にエンコードできます。

DBF リーダーは、VFP がファイルが破損していると判断する理由を調査するのに役立つ可能性のある妥当性のクロスチェックも多数行います。

それが IBM850 を使用していることをどのように知っていますか? 私が持っているもう 1 つの Python コードは、プロトタイプ エンコーディング検出器です。これは、Mozilla コードから派生した「chardet」のような検出器とは異なり、Web 中心ではなく、ほとんどの古い DOS コードページを喜んで認識できます。これは役立つかもしれません。

観察: ギリシャ文字の小文字のシグマ (σ) は、コードページ 437 では 0xE5 であり、コードページ 850 に引き継がれました -- 「pc2」は少し時代遅れのようです ...

私がお役に立てると思われる場合は、insert_punctuation("sjmachin", "lexicon", "net") までお気軽に電子メールをお送りください。

于 2010-11-12T07:27:07.860 に答える
1

dbf ファイルを読むときは、3 種類のエンコーディングを考慮する必要があることを理解する必要があります。

1.データベースプロバイダーがファイルを読み取るエンコーディング。プロバイダーと現在のオペレーティング システムによって異なります。このエンコーディングは、バイト配列の受信に使用されます。たとえば、私のPCでは:

  • 接続文字列 "Data Source={0}; Provider=Microsoft.JET.OLEDB.4.0;Extended Properties=DBase IV;User ID=;Password=;" を使用すると、文字列は 866 コード ページ (ロシア語 MS-DOS) を使用して読み取られます。 )

  • 接続文字列 "Data Source={0}; Provider=vfpoledb.1;Exclusive=No;Collat​​ing Sequence=Machine" を使用すると、文字列はEncoding.Default (1251 コード ページ)を使用して読み取られます。

2.文字列がdbfファイルに書き込まれるエンコーディング。29 バイトの dbf ファイルから受信できますが、実際には dbf ファイルのエンコーディングがどのようにマークされているかに関係なく、どのエンコーディングが使用されたかを知る必要があります。このエンコーディングは、文字列変換時にソース エンコーディングとして使用されます。

3. 文字列を変換するエンコーディング。これは通常 UTF-8 です。

したがって、文字列変換は次のようになります。

byte[] bytes = Encoding.GetEncoding(codePage1).GetBytes(reader.GetString(0));

string result = Encoding.UTF8.GetString((Encoding.Convert(Encoding.GetEncoding(codePage2), Encoding.UTF8, bytes)));
于 2016-11-02T08:57:39.173 に答える
0

代わりに、Visual Foxpro ドライバー「VFPOleDb」ドライバーを使用してみましたか?

于 2010-10-04T11:05:08.460 に答える