在我们的组织中,我们处理不同文件格式的GIS内容。我需要将这些文件放入PostGIS数据库,这是使用ogr2ogr完成的。问题是,数据库是UTF8编码的,文件可能有不同的编码。
我找到了如何通过向org2ogr添加options参数来指定编码的描述,但显然它没有效果。
ogr2ogr -f PostgreSQL PG:"host=localhost user=username dbname=dbname \
password=password options='-c client_encoding=latin1'" sourcefile;
我收到的错误是:
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编码的。
我在这里做错了什么,你能帮助我吗?
亲切的问候,卡斯帕
答案 0 :(得分:11)
Magnus是对的,我将在这里讨论解决方案。
我已经看到了通知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
这对我没有任何帮助。对我来说有用的是在致电ogr2ogr之前:
SET PGCLIENTENCODING=LATIN1
很高兴听到有经验的用户提供更多细节,我希望它可以帮助其他人:)
答案 1 :(得分:10)
这听起来像是将客户端编码设置为LATIN1。究竟你得到什么错误?
如果ogr2ogr未正确传递,您也可以尝试将环境变量PGCLIENTENCODING
设置为latin1
。
我建议你仔细检查一下它们实际上是LATIN1。只需在它上面运行file
就会给你一个好主意,假设它在文件中实际上是一致的。您也可以尝试通过iconv
发送它,将其转换为LATIN1或UTF8。
答案 2 :(得分:7)
目前,来自OGR的GDAL在矢量格式之间的转换期间不执行任何字符数据重新编码。该团队准备了RFC 23.1: Unicode support in OGR文档,该文档讨论了对OGR驱动程序的重新编码的支持。 RFC 23 was adopted和核心功能已在GDAL 1.6.0中发布。但是,大多数OGR驱动程序尚未更新,包括Shapefile driver。
目前,我会将OGR描述为编码不可知和无知。这意味着,OGR确实采取了它得到的东西,并在没有任何处理的情况下发送出去。 OGR使用char类型来处理文本数据。这很适合处理多字节编码的字符串(如UTF-8) - 它只是存储为char元素数组的普通字节流。
建议OGR驱动程序的开发人员应该返回UTF-8编码的属性值字符串,但是这个规则并没有在OGR驱动程序中广泛采用,因此这个功能还没有为最终用户做好准备。
答案 3 :(得分:5)
您需要编写如下命令行:
PGCLIENTENCODING=LATIN1 ogr2ogr -f PostgreSQL PG:"dbname=...
答案 4 :(得分:1)
我使用此命令解决了这个问题:
pg_restore --host localhost --port 5432 --username postgres --dbname {DBNAME} --schema public --verbose "{FILE_PATH to import}"
我不知道这是否是正确的解决方案,但它对我有用。
答案 5 :(得分:0)
在Windows上,命令是
SET PGCLIENTENCODING = LATIN1
在linux上
export PGCLIENTENCODING = LATIN1
或
PGCLIENTENCODING =拉丁文
此外,本讨论对我有帮助:
在Windows上
SET PGCLIENTENCODING =拉丁语ogr2ogr ...
不给我任何错误,但是ogr2ogr不起作用...我需要更改系统变量(例如,系统->高级系统设置->环境变量->新系统变量),重新引导系统并然后运行
ogr2ogr ...
答案 6 :(得分:0)
出于某种原因,我不知道为什么,我无法将其中包含 ÅÄÖ 的表导入到公共架构中。
当我创建一个新架构时,我可以将表导入到新架构中。