使用OleDbConnection读取.dbf文件乱码,如何正确配置编码参数?
OleDbConnection读取.dbf文件编码异常解决方案
核心错误原因
你之前添加CharacterSet编码参数的位置错误,该参数属于dBASE驱动的扩展配置,必须放在Extended Properties的内部,直接写在连接字符串外层会导致驱动识别失败报错。
正确连接字符串写法
// CharacterSet参数放入Extended Properties内部,多个扩展属性用分号分隔,整体用双引号包裹 OleDbConnection conn = new OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + inpath + ";Extended Properties=\"dBASE IV;CharacterSet=WIN1251\";Persist Security Info=False;" );
如果你的dbf文件使用其他编码,替换WIN1251为对应编码标识即可,比如中文编码填写GB2312、GBK。如果不确定文件编码,可以读取dbf文件头的第29位字节,对照dBASE官方编码表确认对应codepage后再填写。
备选解决方案
如果调整连接字符串后仍存在乱码,可选择以下方案处理:
- 手动转码:读取到乱码字符串后,先按驱动默认编码转回字节数组,再用文件实际编码重新解码
// 示例为WIN1251编码的转码逻辑,其他编码替换对应Encoding参数即可 string rawStr = (string)reader["字段名"]; byte[] rawBytes = Encoding.GetEncoding(1252).GetBytes(rawStr); string correctStr = Encoding.GetEncoding(1251).GetString(rawBytes); - 更换适配性更好的驱动:改用Visual FoxPro OLEDB驱动,该驱动对dbf编码的支持更完善,连接字符串参考:
OleDbConnection conn = new OleDbConnection( "Provider=VFPOLEDB.1;Data Source=" + inpath + ";Codepage=1251;" ); - 临时测试方案:修改系统区域设置为对应编码的地区,老版本dBASE文件会依赖系统ANSI编码识别,该方案不建议生产环境使用。
内容的提问来源于stack exchange,提问作者Аслан Ахметжан
相关产品推荐
相关产品推荐

