關於GDAL讀寫Shp亂碼的問題總結

2022-07-04 01:51:14 字數 2050 閱讀 1346

目錄2. 參考

最近在使用gdal讀寫shp格式中的屬性欄位的時候也遇到了中文亂碼的問題,總結下自己遇到的情況。

應該是由於shp格式加入了對寬字元的支援,所以導致有段時間的shp檔案和arcgis是存在不匹配的問題,所以在網上搜尋資源的時候遇到了大量的關於arcmap顯示shp屬性表出現亂碼的問題。現在的shp格式的檔案應該已經穩定下來了,新新增了乙個.cpg的檔案,裡面儲存著屬性表的編碼格式:

圖1-1:shp格式的.cpg檔案

從arcgis10.2開始,只要是屬性表編碼與.cpg檔案記錄的編碼方式一致,就不會再有顯示亂碼的問題。網上查詢到的修改登錄檔的方法,我在arcgis10.2中試過,似乎已經不再起效了。

圖1-2:shp格式的.dbf檔案

在正常顯示中文情況下,可以檢視下檔案的編碼方式:

圖1-3:檢視編碼方式

當然,如果遇到亂碼,可以嘗試用別的編碼方式開啟,這樣你就能知道屬性表具體是什麼編碼了。對於國內的情況來說,只有ansi編碼和unicode編碼兩種:其中簡體中文系統中ansi編碼就是gb2312編碼;utf-8是unicode編碼的一種具體實現。

可以通過全域性設定函式cplsetconfigoption(),來配置讀取shp檔案的讀取編碼。例如對於簡體中文系統中ansi編碼,可以設定為gbk:

cplsetconfigoption("shape_encoding","gbk");
上面這種方式是全域性設定的,如果想設定單個檔案的編碼方式也是可以的。例如,開啟乙個向量檔案讀取為utf-8的資料集:

char** ppszoptions = null;

ppszoptions = cslsetnamevalue(ppszoptions, "encoding", "utf-8");

gdaldataset *pods = (gdaldataset*)gdalopenex(filepath.c_str(), gdal_of_vector, null, ppszoptions, null);

網上提供的解決方案都是將編碼方式設定為空[1],這種方式應該更具有通用性,起碼我這裡讀取gbk和utf-8格式的shp的格式都是可以的:

cplsetconfigoption("shape_encoding","");
如果讀取出來的字段屬性仍然是亂碼,就應該考慮字串的解碼問題,就是獲取的字段屬性字串沒有正確的解碼出來。例如讀取utf-8的shp檔案的屬性字段:

ogrfeature *pofeature;

while ((pofeature = polayer->getnextfeature()) != null)

//cout << endl;

ogrfeature::destroyfeature(pofeature);

}

預設情況下,cout是無法正確列印輸出utf-8字元編碼的,通過utf8_to_string這個函式,將utf-8編碼的字串轉換成本地ansi編碼,也就是gbk編碼字串,就可以正確輸出顯示了。附帶一下兩者的轉換函式[2]:

// utf8轉std:string

// 轉換過程:先將utf8轉雙位元組unicode編碼,再通過widechartomultibyte將寬字元轉換為多位元組。

std::string utf8_to_string(const std::string& str)

// std:string轉utf8

std::string string_to_utf8(const std::string& str)

還有個值得注意的問題就是shp格式的屬性欄位名稱的長度最大只能支援10個字元。如果採用utf-8編碼,可能用不了幾個中文字元就被截斷了,這個時候屬性欄位名稱也可能存在亂碼。

[1] gdal/ogr 1.9.0獲取shp檔案中中文字段值和屬性值亂碼檔案解決

[2] utf8與std:string互轉

關於QGIS開啟SHP檔案屬性表亂碼

解決方案是從網上看到的,乙個台灣的朋友給出了具體的解決方法。但他說的方法的最後一步對我來說不適用,我稍作修改 載入shp檔案到qgis中。開啟shapefile encoding fixer,選中要修正的shp圖層。在fix encoding declaration中,選擇set cpg file ...

GDAL建立UTF 8編碼格式的shp檔案

1 設定全域性選項 osgeo.gdal.gdal.setconfigoption gdal filename is utf8 yes 支援中文 osgeo.gdal.gdal.setconfigoption shape encoding utf 8 網路上基本是將shape encoding設定為...

Visual C 2010中GDAL的配置問題

這幾天在用gdal讀取乙個shapefile資料,一直糾結於網上沒有合適的配置教程,經過探索找到了乙個配置步驟 1.gdal的編譯 gdal的安裝網上有一大堆教程,這個我就不細說了,但是值得一提的時,把gdal編譯以後生成的乙個資料夾可以備份一下,這樣下次用gdal的時候就不需要重新編譯了,這裡我就...