使用ogr2​​ogr和Postgis/PostgreSQL数据库编码问题

Cha*_*hau 8 gis postgresql postgis character-encoding gdal

在我们的组织中,我们处理不同文件格式的GIS内容.我需要将这些文件放入PostGIS数据库,这是使用ogr2​​ogr完成的.问题是,数据库是UTF8编码的,文件可能有不同的编码.

我找到了如何通过向org2ogr添加options参数来指定编码的描述,但显然它没有效果.

ogr2ogr -f PostgreSQL PG:"host=localhost user=username dbname=dbname \
password=password options='-c client_encoding=latin1'" sourcefile;
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

ERROR 1: ALTER TABLE "soer_vd" ADD COLUMN "målsætning" CHAR(10)
ERROR: invalid byte sequence for encoding "UTF8": 0xe56c73
HINT: This error can also happen if the byte sequence does not match the 
encoding expected by the server, which is controlled by "client_encoding".

ERROR 1: ALTER TABLE "soer_vd" ADD COLUMN "påvirkning" CHAR(10)
ERROR: invalid byte sequence for encoding "UTF8": 0xe57669
HINT: This error can also happen if the byte sequence does not match the 
encoding expected by the server, which is controlled by "client_encoding".

ERROR 1: INSERT command for new feature failed.
ERROR: invalid byte sequence for encoding "UTF8": 0xf8
HINT: This error can also happen if the byte sequence does not match the 
encoding expected by the server, which is controlled by "client_encoding".

目前,我的源文件是一个Shape文件,我很确定它是Latin1编码的.

我在这做错了什么,你能帮助我吗?

亲切的问候,卡斯帕

Cha*_*hau 11

马格努斯是对的,我将在这里讨论解决方案.

我已经看到了通知PostgreSQL关于字符编码的选项options=’-c client_encoding=xxx’,使用了很多地方,但它似乎没有任何影响.如果有人知道这部分是如何工作的,请随意详细说明.

Magnus建议将环境变量PGCLIENTENCODING设置为LATIN1.根据我查询的邮件列表,这可以通过修改对ogr2ogr的调用来完成:

ogr2ogr -–config PGCLIENTENCODING LATIN1 –f PostgreSQL 
PG:”host=hostname user=username dbname=databasename password=password” inputfile
Run Code Online (Sandbox Code Playgroud)

这对我没有任何作用.对我来说有用的是在致电ogr2ogr之前:

SET PGCLIENTENCODING=LATIN1
Run Code Online (Sandbox Code Playgroud)

听到有经验的用户的更多细节会很棒,我希望它可以帮助别人:)


Mag*_*der 10

这听起来像是将客户端编码设置为LATIN1.究竟你得到什么错误?

如果ogr2ogr没有正确传递它,您也可以尝试将环境变量设置PGCLIENTENCODINGlatin1.

我建议你仔细检查一下它们实际上是LATIN1.只要file在文件中实际上保持一致,只需在它上面运行就会给你一个好主意.您也可以尝试发送它iconv以将其转换为LATIN1或UTF8.


mlo*_*kot 7

目前,OGRGDAL不矢量格式之间的转换过程中执行字符数据的任何重新编码.该团队已在OGR文档中准备了RFC 23.1:Unicode支持,该文档讨论了对OGR驱动程序的重新编码的支持.该RFC 23获得通过,并在核心功能GDAL 1.6.0已经被释放.但是,大多数OGR驱动程序尚未更新,包括Shapefile驱动程序.

暂时,我会将OGR描述为编码不可知和无知.这意味着,OGR确实采取了它得到的东西,并在没有任何处理的情况下发送出去.OGR使用char类型来处理文本数据.这很适合处理多字节编码的字符串(如UTF-8) - 它只是存储为char元素数组的普通字节流.

建议OGR驱动程序的开发人员应该返回UTF-8编码的属性值字符串,但是这个规则并没有在OGR驱动程序中广泛采用,因此这个功能还没有最终用户准备好.


小智 6

您需要像这样编写命令行:

PGCLIENTENCODING=LATIN1 ogr2ogr -f PostgreSQL PG:"dbname=...
Run Code Online (Sandbox Code Playgroud)

  • 我不知道您的答案如何提供与已发布的答案相比的其他信息? (2认同)
  • 对我来说 `SET PGCLIENTENCODING=LATIN1` 不起作用。这个答案对我有帮助。 (2认同)