【问题标题】:Problem reading dBase DBF with non-English characters使用非英文字符读取 dBase DBF 时出现问题
【发布时间】:2011-03-15 13:06:10
【问题描述】:

我有一个工具,它可以读取 dBase 文件并将内容上传到 SQL Server,它是导入 shapefile 系统的一部分。它可以工作,但现在我们需要导入包含非英语字符(在这种情况下为挪威语,稍后可能是其他语言)的文件,并且它们已被损坏。

正在使用 OleDbDataAdapter 读取 dBase 文件。单步执行代码,我可以看到文本在读入时是错误的。我假设它与代码页或 Unicode 有关,但我不知道如何修复它。

一个 dBase Reader 应用程序告诉我 DBF 在代码页 1252 中 - 我不知道这是否正确。我的上传工具在 Win7 上运行,具有英语(英国)区域设置。

例子:

DBF 中的ÅSGARD 在 VB.Net 和 SQL Server 中变为 +SGARD。

DBF 中的 RINGHORNE ØST 在 VB.Net 和 SQL Server 中变为 RINGHORNE ÏST。

读取 DBF 的代码:

dbfConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & ";Extended Properties=dBASE IV"
Cnn.ConnectionString = dbfConnectionString
Cnn.Open()

strSQL = "SELECT * FROM [" & strDBF & "]"
DA = New OleDb.OleDbDataAdapter(strSQL, Cnn)
DS = New DataSet
DA.Fill(DS)

If DS.Tables(0).Rows.Count > 0 Then
  dtDBF = DS.Tables(0)
Else
  dtDBF = Nothing
End If

数据读取如下:Name = dtDBF.Rows(index)("NAME_1")

有没有办法告诉 OleDbDataAdapter 使用哪个代码页或从 VB.Net 读取 dBase 文件的更好方法?

【问题讨论】:

  • 如果我导入或链接 dBase 表,MS Access 的作用与 .net / SQL Server 相同。

标签: vb.net shapefile dbase


【解决方案1】:

尝试将此添加到您的 DSN:

CollatingSequence=Norwegian-Danish

您也许还可以使用:

CollatingSequence=International

【讨论】:

  • 不幸的是,这些都不能解决问题,挪威字符仍然被错误地读取。
【解决方案2】:

检查 shapefile 是否包含代码页信息。有two placeslook

  • 查看language driver ID (LDID),它位于 shapefile 的 DBF 表头(在第 29 个字节中)。
  • 查找扩展名为 .cpg 的关联单独文件。

如果未在这些位置指定代码页,则默认为生成 shapefile 的 PC 上的代码页。你只需要知道:(

我从未使用过它,但也许Shape2SQL 会为您处理这个问题?还是shp2text?我相信PostGIS shapefile loader 处理代码页:也许您可以导入 PostGIS,然后以另一种格式导出??

【讨论】:

  • 没有 cpg 文件,并且最初生成这些 shapefile 的 PC 位于另一个国家/地区的另一个组织中,因此我无法找到它的代码页设置。这些形状文件将由 GIS 人员编辑,然后每周数次上传到数据库,因此对他们来说需要一个简单的过程。我们目前的流程已经为英国的形状文件运行了 18 个月,所以我们真的需要让它也适用于挪威的形状文件。 ESRI 链接非常方便,谢谢。
  • 您知道另一台 PC 在挪威,因此他们可能使用代码页 Windows-1252,就像英国一样。我很惊讶你会遇到这个问题。您是否检查过 DBF 文件中的语言驱动程序 ID?只需在 Visual Studio 二进制编辑器中打开它(文件 - 打开文件 - 使用二进制编辑器打开)
【解决方案3】:

老问题,但这可能会为未来的读者解答......

您可以尝试在连接字符串中添加属性设置:

Locale Identifier=1044

这个属性(以及包括这个属性的值列表)是为 ADO 与 Jet 4.0 的 OLDB Provider 一起记录的,但我没有理由相信 ADO.Net 也不支持它。此值 (1044) 是挪威语/丹麦语。

未经测试,但可以尝试其他方法。

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多