2009-09-04 64 views
7

在我們的組織中,我們處理不同文件格式的GIS內容。我需要將這些文件放入PostGIS數據庫,並使用ogr2​​ogr完成。問題是,數據庫是UTF8編碼的,文件可能有不同的編碼。ogr2ogr和Postgis/PostgreSQL數據庫的編碼問題

我發現瞭如何通過向org2ogr添加選項參數來指定編碼的說明,但是顯然它沒有效果。

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的編碼。

我在這裏做錯了什麼,你能幫助我嗎?

親切的問候,卡斯帕

回答

9

這聽起來像它會在客戶端編碼設置爲LATIN1。你究竟得到什麼錯誤?

爲防萬一ogr2ogr沒有正確傳遞它,您還可以嘗試將環境變量PGCLIENTENCODING設置爲latin1

我建議你仔細檢查一下,他們實際上是LATIN1。只要在其上運行file就會給你一個好主意,假設它在文件中是一致的。您也可以嘗試通過iconv發送它以將其轉換爲LATIN1或UTF8。

+0

我已經嘗試了client_encoding和PGCLIENTENCODING來選擇編碼方案。他們都沒有解決我的問題。由於我還沒有找到一種方法來確定我的形狀文件的確切字符編碼,我嘗試了LATIN1,LATIN9,WIN1250和WIN1252,但仍然沒有成功。仍在尋找讓iconv工作...... – Chau 2009-09-07 09:05:39

11

Magnus是對的,我將在這裏討論解決方案。

我已經看到通知PostgreSQL有關字符編碼的選項,options=’-c client_encoding=xxx’,使用了很多地方,但它似乎沒有任何效果。如果有人知道這部分是如何工作的,請隨意闡述。

Magnus建議將環境變量PGCLIENTENCODING設置爲LATIN1。這可以根據郵件列表我查詢,可以通過修改調用ogr2​​ogr完成:

ogr2ogr -–config PGCLIENTENCODING LATIN1 –f PostgreSQL 
PG:」host=hostname user=username dbname=databasename password=password」 inputfile 

這並沒有爲我做任何事。什麼工作對我來說是,調用ogr2​​ogr前,要:

SET PGCLIENTENCODING=LATIN1 

這將是偉大聽到有經驗的用戶更多的細節,我希望它可以幫助別人:)

+0

在我看來,SET命令是特定於Windows的。這裏有一個類似的話題:http://gis.stackexchange.com/questions/15912/how-to-encode-shapefiles-from-latin1-to-utf-8,他們在Linux下建議使用EXPORT命令。但也許我錯了。無論如何,SET在Windows下爲我工作。 – 2016-02-16 14:50:59

7

目前,OGRGDAL在向量格式之間轉換期間不執行字符數據的任何重新編碼。該小組編寫了RFC 23.1: Unicode support in OGR文件,其中討論了支持OGR驅動程序的重新編碼。 GDAL 1.6.0中已經發布了RFC 23 was adopted和核心功能。但是,大多數OGR驅動程序尚未更新,包括Shapefile driver

目前,我將OGR描述爲編碼不可知和無知。這意味着,OGR確實將其獲取的內容發送出去而不進行任何處理。 OGR使用char類型來操縱文本數據。這對於處理多字節編碼字符串(如UTF-8)來說很好 - 它只是存儲爲char元素數組的簡單字節流。

建議OGR驅動程序的開發者應該返回屬性值的UTF-8編碼字符串,但是這個規則還沒有在OGR驅動程序中被廣泛採用,從而使得這個功能還沒有終端用戶準備好。

5

您需要在命令行中這樣寫:

PGCLIENTENCODING=LATIN1 ogr2ogr -f PostgreSQL PG:"dbname=... 
+2

我不明白你的答案與已發佈的答案相比如何提供更多信息? – Chau 2012-03-15 14:13:50

+1

對於我'SET PGCLIENTENCODING = LATIN1'沒有奏效。這個答案幫了我。 – 2015-08-06 15:02:19

1

我使用此命令解決了這個問題:

pg_restore --host localhost --port 5432 --username postgres --dbname {DBNAME} --schema public --verbose "{FILE_PATH to import}" 

我不知道這是否是正確的解決方案,但它爲我工作。