2009-09-04 33 views
7

Trong tổ chức của chúng tôi, chúng tôi xử lý nội dung GIS theo các định dạng tệp khác nhau. Tôi cần phải đưa những tập tin này vào một cơ sở dữ liệu PostGIS, và điều đó được thực hiện bằng cách sử dụng ogr2ogr. Vấn đề là, cơ sở dữ liệu được mã hóa UTF8 và các tệp có thể có một mã hóa khác.Sự cố mã hóa với cơ sở dữ liệu ogr2ogr và Postgis/PostgreSQL

Tôi đã tìm thấy các mô tả về cách tôi có thể chỉ định mã hóa bằng cách thêm thông số tùy chọn vào org2ogr, nhưng lại không có hiệu lực.

ogr2ogr -f PostgreSQL PG:"host=localhost user=username dbname=dbname \ 
password=password options='-c client_encoding=latin1'" sourcefile; 

Các lỗi tôi nhận được là:

 
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". 

Hiện nay, tập tin nguồn của tôi là một tập tin Shape và tôi khá chắc chắn, rằng nó được latin1 mã hóa.

Tôi đang làm gì sai ở đây và bạn có thể giúp tôi không?

Trân trọng, Casper

Trả lời

9

Điều đó có vẻ như nó sẽ đặt mã hóa khách hàng thành LATIN1. Bạn nhận được lỗi chính xác nào?

Chỉ trong trường hợp ogr2ogr không truyền theo đúng cách, bạn cũng có thể thử đặt biến môi trường PGCLIENTENCODING thành latin1.

Tôi khuyên bạn nên kiểm tra kỹ xem chúng có thực sự là LATIN1 hay không. Chỉ cần chạy file trên đó sẽ cung cấp cho bạn ý tưởng hay, giả sử nó thực sự nhất quán trong tệp. Bạn cũng có thể thử gửi thông qua iconv để chuyển đổi nó thành LATIN1 hoặc UTF8.

+0

Tôi đã thử cả client_encoding và PGCLIENTENCODING để chọn một lược đồ mã hóa. Không ai trong số họ giải quyết được vấn đề của tôi. Vì tôi chưa tìm được cách xác định mã hóa ký tự chính xác của các tệp hình dạng của mình, tôi đã thử LATIN1, LATIN9, WIN1250 và WIN1252, nhưng vẫn không thành công. Vẫn đang tìm kiếm biểu tượng để làm việc ... – Chau

11

Magnus là đúng và tôi sẽ thảo luận giải pháp ở đây.

Tôi đã thấy tùy chọn thông báo cho PostgreSQL về mã hóa ký tự, options=’-c client_encoding=xxx’, được sử dụng nhiều địa điểm, nhưng dường như không có bất kỳ ảnh hưởng nào. Nếu ai đó biết làm thế nào phần này đang làm việc, cảm thấy tự do để xây dựng.

Magnus được đề xuất để đặt biến môi trường PGCLIENTENCODING thành LATIN1. Điều này có thể, theo danh sách gửi thư mà tôi truy vấn, được thực hiện bằng cách sửa đổi cuộc gọi thành ogr2ogr:

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

Điều này không làm gì cho tôi. Có gì làm việc cho tôi là, trước khi cuộc gọi đến ogr2ogr, để:

SET PGCLIENTENCODING=LATIN1 

Nó sẽ là tuyệt vời để nghe thêm chi tiết từ những người dùng có kinh nghiệm và tôi hy vọng nó có thể giúp đỡ người khác :)

+0

Dường như với tôi lệnh SET là cửa sổ cụ thể. Có một chủ đề tương tự ở đây: http://gis.stackexchange.com/questions/15912/how-to-encode-shapefiles-from-latin1-to-utf-8 và họ đề xuất lệnh XUẤT KHẨU trong Linux. Nhưng có lẽ tôi đã sai. Dù sao, SET làm việc dưới Windows cho tôi. –

7

Hiện nay, OGR từ GDAL không thực hiện bất kỳ việc ghi lại dữ liệu ký tự nào trong quá trình dịch giữa các định dạng vectơ. Nhóm nghiên cứu đã chuẩn bị tài liệu RFC 23.1: Unicode support in OGR thảo luận về hỗ trợ việc mã hóa cho trình điều khiển OGR. RFC 23 was adopted và chức năng cốt lõi đã được phát hành trong GDAL 1.6.0. Tuy nhiên, hầu hết các trình điều khiển OGR chưa được cập nhật, bao gồm Shapefile driver.

Hiện tại, tôi sẽ mô tả OGR là mã hóa thuyết bất khả tri và không biết gì. Nó có nghĩa là, OGR thực hiện những gì nó nhận được và gửi nó ra mà không cần xử lý. OGR sử dụng kiểu char để thao tác dữ liệu văn bản. Điều này là tốt để xử lý các chuỗi được mã hóa nhiều byte (như UTF-8) - nó chỉ là một luồng đồng bằng các byte được lưu trữ dưới dạng mảng các phần tử char.Chúng tôi khuyên các nhà phát triển trình điều khiển OGR phải trả về chuỗi giá trị thuộc tính UTF-8, tuy nhiên quy tắc này chưa được áp dụng rộng rãi trên các trình điều khiển OGR, do đó làm cho chức năng này chưa sẵn sàng cho người dùng cuối.

5

Bạn cần phải viết dòng lệnh của bạn như thế này:

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

Tôi không thấy câu trả lời của bạn cung cấp thông tin bổ sung như thế nào so với các câu trả lời đã đăng? – Chau

+1

Đối với tôi 'SET PGCLIENTENCODING = LATIN1' không hoạt động. Câu trả lời này đã giúp tôi. –

1

tôi giải quyết vấn đề này bằng lệnh này:

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

Tôi không biết nếu điều này là giải pháp đúng, nhưng nó đã làm cho tôi.

Các vấn đề liên quan