我正在开发一个需要从/向fox pro dbf free表读/写数据的项目。我之前没有读过或写入数据的问题。当计算机上的代码页设置为与表中使用的代码页不同时,我的问题就出现了。
这些表在windows-1250代码页中编码,而运行我的exe的计算机配置为使用windows-1250,一切都按预期进行。一旦我在具有不同代码页的计算机上运行该程序,比如说windows-1252,我就会得到奇怪的字符。
这些是我的发现:
只能在Codepage
命令中观察CPCURRENT()
属性,该命令返回Codepage
中设置的任何值,但不会对返回的值产生任何影响。
Provider=VFPOLEDB.1;Data Source=some\path;Codepage=1250;Collating Sequence=MACHINE;Mode=ReadWrite|Share Deny None;
返回的值不会被转换,只是使用不正确的编码从源中读取。
using (var connection = new OleDbConnection(connectionString))
{
var encoding1250 = Encoding.GetEncoding(1250);
var encoding1252 = Encoding.GetEncoding(1252);
var raw = connection.ExecuteScalar<string>("SELECT column FROM tbl0"); // returns 'éevernka' - incorrect
var bytes = encoding1252.GetBytes(raw);
var correct = encoding1250.GetString(bytes); // contains 'červenka' - correct
}