Shapefile中文亂碼問題

???? ArcGIS10.2之后的桌面版本ArcMAP打開之前保存的Shapefile文件,總會不時遇到中文字符出現(xiàn)亂碼現(xiàn)象,這是因為新舊版本的默認編碼規(guī)則變化導致:
???? ArcGIS10.2.1之前版本,Shapefile根據(jù)Locale進行編碼,即注冊表中的

My Computer\HKEY_CURRENT_USER\Software\ESRI\Desktop 10.x\下的common—codepage—dbfDefault。

???? ArcGIS10.2.1及之后版本,Shapefile一般是utf-8編碼,ArcGIS會先讀取DBF頭文件LDID中的編碼,然后是CPG文件,最后是CodePage。

解決方法

說明:中文出現(xiàn)亂碼的根本原因是讀取文件使用的編碼類型和文件實際存儲的編碼類型不一致。
???? 在ArcGIS Desktop 生產(chǎn) shapefile 數(shù)據(jù)中,頭文件(dBase Header)中,一般會包含shapefile使用的編碼類型的信息,即 LDID ( Language Driver ID),它告訴應用程序用何種編碼類型去正確讀取它。
???? 在Shapefile的子文件中,有時我們還會發(fā)現(xiàn)同名 .cpg 文件,文件中也存儲了編碼信息,用記事本打開,看到例如UTF-8。
???? 二者被ArcGIS 識別的優(yōu)先順序是, LDID 優(yōu)先于 CPG文件
???? 在Windows中文語言設置下,假設你自己寫代碼或者使用第三方的程序生產(chǎn)了shapefile,默認使用 CP936(GBK)編碼存儲,忘記在數(shù)據(jù)頭文件中約定 LDID ( Language Driver ID)。如果是 ArcGIS 10.2之前的版本,ArcGIS 默認就是以這種方式識別,不會出現(xiàn)中文亂碼。如果用高于 ArcGIS 10.2的版本打開這個shapefile,中文就會出現(xiàn)亂碼,因為在缺失 LDID 和 CPG時,ArcGIS默認使用 UTF-8 來讀取 shapefile 。在shapefile文件里創(chuàng)建個記事本,修改為同名的*.cpg 文件,文本內(nèi)容oem或者936。
如何檢測shapefile是用什么編碼,如果不知道Shapefile的編碼類型,可以使用程序檢測:共享別人寫的一個python代碼:

import struct
dbf = 'D:\tShapefiles\test.dbf'
dat = open(dbf, 'rb').read(30)[29:]
id = struct.unpack('B', dat)[0] 
print(id, hex(id))

例如,得到這樣的打印結(jié)果:

[b](77, '0x4d')[/b]

通過這樣的 ID 到 [編碼表] http://shapelib.maptools.org/codepage.html
,查到就是 CodelPage 936

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容