首页 > 其他 > 详细

ArcGis——好好的属性表,咋就乱码了呢?

时间:2019-04-09 23:06:52      阅读:954      评论:0      收藏:0      [点我收藏+]

我就瞎说一下,反正你也不懂。

    ——见到许多ArcGis属性表乱码的问题,也见过各种哭笑不得的解说

第一节 字符编码那些事儿

  计算机以二进制的形式存储信息。

  ASCII

  最早,美国佬发明了“字符编码”这种东西,起名叫ASCII(American standard Code for information Interchange)。它包含了128个字符(0-127),每个字符用8个二进制位表示,第1位规定为0,后7位标识一个字符。比如‘A’表示为二进制是01000001,十进制是65,十六进制是0x41,这也就是我们常说的一个英文字母占1个字节,8bit=1Byte。

  美国佬觉得一个字节(可以表示256个编码)表示英语世界里所有的字母、数字和常用特殊符号已经绰绰有余了(其实ASCII只用了前127个编码)。后来,欧洲国家不干了,他们发现ASCII并不能标识他们的字母,于是ASCII码中127号之后的空位被用来表示这些字符,128-255这一页字符集被称为扩展字符集。为啥是-255?8个二进制位表示十进制数最大也就是255。

  这就够了?差的远呢!

  GB2312

  后来,中国也用上计算机了,日本、韩国……一众国家也用上了,这回事儿大了这么些文字怎么表示?字符编码方案GB2312就这样出来了,它相当于对ASCII的扩展。小于等于127的继续使用,用2个大于127的字节表示一个中文字符,前面的一个字节(称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码中,数学符号,希腊的字母,日文的假名都编进去了,连ASCII里本来就有的数字,标点,字母都统统重新编了两个字节长的编码,这就是常说的“全角”符号,而原有的127号以下的那些字符称为“半角”符号。当然,日本、韩国等的一众国家也整出了自己的双字节字符编码方案。

  GBK

  再后来,越用越觉得这些中文还是不够用啊!生僻字和繁体字等还是无法识别怎么办?于是要求高字节大于127(低字节0-255)的就认为是2字节的中文字符,这样拓展之后就是GBK标准。GBK收录了2万多汉字及符号,因其最早被WINDOWS采用,所以其应用范围非常广。但后来少数民族同胞也要用计算机,于是为了扩展少数民族字符,GBK被扩展为GB18030。

  中国GBK、日本Shift_JIS、韩国EUC-KR……这些编码规则都使用了ANSI标准,这里面存在一个bug。都是双字节表示一个文字,那中文到韩文系统下会发生什么情况?乱码!你猜对了。

  UTF-8

  ISO(国际标准化组织)决定制定一个统一的包括全世界所有字符的编码标准,包括字符集、编码方案等,叫做"Universal Multiple-Octet Coded Chracter Set",简称UCS,俗称Unicode标准(注意想想ANSI标准,它俩都不是具体的字符编码规则)。在Unicode中,直接规定必须用两个字节,ASCII那些半角字符,保持原编码不变,只是将其长度由原来的8位扩展为16位(高8位全为0),而其他文化和语言的字符则全部重新统一编码。
  半角字符如果用两个字节表示,很浪费空间,而计算机大部分内容还是英文。作为Unicode字符集的一种编码方式,UTF-8采用变长编码,使用1-4个字节表示一个字符,其特点是,对不同范围的字符使用不同长度的编码。这样,UTF-8中那些半角字符就用1个字节(8个二进制位)表示,而中文使用3个字节表示

  每个字符编码都对应有一个“字符集”,字符集对应若干“字体库”,从别处拷贝或者网络来一个文件,编码规则对了计算机才能在正确的“字符集”找到对应的字符,使用对应的字体显示出来。系统环境或者编码规则没选对,那就乱了呗。

第二节 都是编码惹的祸

  编码说,这个锅它不想背。

  前面说了windows系统默认使用ANSI编码标准,中文系统下是GBK,10.2之前的ArcGis也默认这个“默认”给dbf编码,所以2个字节表示一个汉字,所以一个字段名最多(11字节)5个汉字。

技术分享图片

  而自10.2.1之后,Esri潮了一把,dbf编码用了UTF-8(为啥潮自己百度),这样一个字段名也就只能写3个汉字了,因为11mod3=2。这样就导致了乱码与字段名字符截断的问题。 

第三节 dbf它的错

  在ArcGIS Desktop 创建 shapefile 文件,其头文件(dBase Header)中,一般会包含shapefile使用的编码类型的信息,即 LDID ( Language Driver ID),它告诉应用程序用何种编码类型去正确读取它。在Shapefile的子文件中,有同名 *.cpg 文件,文件中也存储了编码信息,用记事本打开,看到例如UTF-8、GBK。二者都标识了dbf的编码方式,被ArcGIS 识别的优先顺序是,LDID 优先于 CPG文件。

  修改默认Codepage,可以改变ArcGis创建新Shapefile文件时dbf的编码格式。注意!这里划重点,改了这里只是以后创建新的采用何种编码方式,并不会改变已有dbf文件的编码方式,也就解决不了它的乱码!

  ArcMap读取dbf属性表乱码

  由于Shapefile是开放数据格式,所以有可能在使用第三方工具创建或者其他一些情况中,忽略了 Language Driver ID的声明,会导致读取乱码,这时,尝试添加同名文件 *.cpg

  ArcGis属性表导出Excel乱码

  移步ArcGis 属性表.dbf文件使用Excel打开中文乱码的解决方法

 

参考:

ArcGis 属性表.dbf文件使用Excel打开中文乱码的解决方法

ArcGis dbf读写——挂接Excel到属性表 C#

ANSI是什么编码?

十分钟搞清字符集和字符编码

GB2312 80信息交换用汉字编码字符集 基本集

GB 18030-2005信息技术 中文编码字符集

 

 

ArcGis——好好的属性表,咋就乱码了呢?

原文:https://www.cnblogs.com/yzhyingcool/p/10679551.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!