Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >编码、R 与 Windows (一)

编码、R 与 Windows (一)

作者头像
用户7652506
发布于 2020-10-23 03:51:07
发布于 2020-10-23 03:51:07
1.1K0
举报

磨人的编码

编码问题就像蛀牙一样——平时不曾注意,直到他给你造成成吨伤害。

本期大猫将开个新帖介绍R中的编码问题。就像导言中说的,编码是一个常常被忽视的“小问题”——直到他给你造成成吨的伤害Orz。它尤其频繁出现于数据传输中,例如你在澳大利亚的机器上建立的SAS数据集死活没法在中国的SAS中打开,或是R 操作台打印中文总是乱码等等(关于中文编码请阅读大猫上一期《我知道你不知道GB2312》)。大猫新开这个系列的目的就是帮助大家在最短时间搞明白你所要知道的关于编码的一切。最重要的是,这篇文章不会过于详细的探讨这些编码背后的原理,而是明确告诉大家在什么样的时候应该用什么样的编码(相信这是大家最希望了解的)。至于这些编码背后的复杂原理以及历史,大猫会在最后放上链接,有兴趣的小伙伴可以自行阅读。由于尽量追求通俗易懂,下面内容可能无法在技术上保证100%的严谨,但是大猫保证,以下95%的论述都是正确的!

今天的文章分成两部分,第一部分介绍常见的编码格式,包括ASCIIANSIUTF-8,是后面所有内容的基础;第二部分讲解这些编码在Windows中的版本——Code page。在下一期中,大猫将着重讲解Windows平台下R的编码系统。

对于特别没有耐心的小伙伴,在这里先放上结论:

  • ASCII是个古董,能表示的字符最少,且不能表示中文,几乎被淘汰。后来所有新的编码都兼容ASCII
  • ANSI是ASCII的扩展,由国际标准组织(ISO)定义,且每个语言都有一套自己的ANSI编码体系,西文中最常用的那个版本叫 ISO-8895-1 (Latin-1),也是R所支持的三大编码之一;
  • 简体中文常见ANSI类型编码有GB2312GBKGB18030
  • Windows把ISO标准的ANSI编码称为“代码页”(Code page,CP)其中ISO-8895-1 (Latin-1)被称为CP-1252,简中编码GBK被称为CP-936
  • Unicode是一类代码的统称,是出现最晚、最先进的代码系统,可以表示所有语言。UTF-8是其中最流行的编码格式,也是我们传输文件的首选。

(话说从这一期开始,“大猫的R语言课堂”有原文链接了,欢迎大家去戳哈。

么是ASCII、ANSI、UTF-8?

在过去的几十年间,为了能够在计算机中表示字符,人们发明了上百种编码格式,标题中这些术语应该是最广为人知的(可能还包括GB2312、GBK、GB18030)。说实话,这些编码格式很多程序员自己也不是很清楚,我们自然也不需要刨根问题。但是这些编码的特点、以及什么时候应该采用是大家最关心的问题。大猫试着用最浅显易懂的语言按照时间顺序对他们逐一介绍。

ASCII

大家把ASCII看作最原始的(当然还有更早的,但是我们没有必要知道)编码格式。ASCII最多只能表示128种字符(由整数0-127表示)。由于我们现在常用的字符数(别忘了emoji也是字符!)远远多于128,所以现在几乎没人用ASCII了。更重要的是,目前所有新的编码全都兼容ASCII。

要点:一个古董编码系统,无法处理中文(乱码)。

ANSI

由于ASCII的严重缺陷(法国人:法语是世界上最美的语言,你TM竟然计算机无法识别法文?!),人们试图对ASCII进行扩展。这一扩展就不得了,每个国家都搞出了一套自己的编码体系,而且互相不兼容!这还怎么玩!于是一群聪明人聚在一块说:好吧,既然没法统一用一套编码体系,那么至少我们该给现有的编码体系编个号吧?这样我们以后交流数据,只要报上这个代号就知道对方用的是啥了。

于是一大群人聚集在国际标准组织位于维也纳的总部进行了热烈的讨(撕)论(逼),之后,一大批编码被纳入了ISO体系(国际标准),这些编码被统称为ANSI编码。对于R的使用者来说,我们只需要知道其中的一种编码就够了:ISO-8895-1(划重点了!)ISO-8895-1又被称为ISO-Latin-1或者Latin-1。这是一种能够包含英语以及西欧绝大多数语言(法语德语西班牙语等)的编码格式,后来几乎成了“西方世界”的标准编码格式。ISO-8895-1(Latin-1)也是R”钦定”的三种字符编码格式之一,也即Encoding(char)所可能返回的三种结果之一。

那中文有没有自己的ANSI编码呢?当然是有的,按发明的时间顺序,最常见的是中文编码是GB2312GBKGB18030 (GB是“国标”的意思),越晚发明的编码所包含的字符越多。然而他们在Windows系统中有不同的名称(CP-936),关于中文编码的请阅读大猫上一期《我知道你不知道GB2312》。

要点:

  • 每种语言都有自己的ANSI编码,其中某个分支叫做ISO-8895-1 (Latin-1),被西方国家广为采用,也是R所“钦定”的编码之一;
  • 虽然ISO-8895-1 (Latin-1) 能支持很多西欧语言,但是仍旧无法处理中文!
  • 能够处理中文的ANSI编码中,最常见的有GB2312GBK、GB18030;
  • 以上这些ANSI编码在Windows中有另外的名称,后述。

(注:ANSI是美国标准协会的简称,至于为啥它会成为某一类编码的统称又是另一个故事了。)

Unicode与UTF-8(UTF-16)

没有几个人能够100%声称自己懂Unicode,因为Wikipedia上关于Unicode的定义都有很多矛盾的地方!但是没关系,你知道下面大猫说的就够了。

话说每种语言都有了自己的ANSI编码系统,可谓皆大欢喜。但是每种语言都单独编码还是太麻烦了,有没有可以用一套编码体系涵盖下所有的语言呢?结果自然是有的——Unicode。你看它的命名就知道了——“Uni”-code一出生就有一统天下的气魄。但是Unicode有个致命的问题:它只是一种编码的“思想”(确切来说叫 code point,嗯这个不重要……),而不是具体的编码格式!这就好比我手上有地图不等于我就能到达目的地,或是我知道核聚变的原理并不等于我能造的出氢弹一样。于是维也纳国际标准协会的那帮人又展开了一阵激烈的讨(撕)论(逼),最后遵循Unicode的思想搞出了一套牛逼的编码系统——UTF-8

UTF-8的好处是显而易见的:可以表示世界上任何一种字符,当然包括中文!数据采用UTF-8编码可以在任何一个国家畅行无阻,再也不用担心换了个国家SAS文件乱码了。非常自然的,UTF-8成为了目前最受欢迎的编码格式,Python 3就采用了UTF-8编码。

也许很多小伙伴还看到过UTF-16以及UCS-2等编码格式,这里一句话介绍下。UTF-16和UCS-2和UTF-8一样,都是按照Unicode思想所开发出来的代码。UTF-16的好处是它于在多语言环境中拥有比UTF-8更好的性能(因为它用16 bit来表示一个unit,因此不太需要把一个字符拆成多个byte。嗯这个你同样不需要知道……)因此UTF-16成为了Windows以及Java内部所采用的编码格式。至于UCS-2(或者UCS-4),虽然也是按照Unicode思想开发的,但是他们比UTF系列编码更占空间,已经逐渐被淘汰了。

总结:UTF-8是按照Unicode思想所打造的、目前最流行的编码格式,支持中文,保存文件首选!其它的UTF系列编码仅在特定场合有用。

W

indows、Code page与R

当你处在垄断地位的时候,很多事情就可以由着自己性子来了,例如苹果的lighting接口。微软也是一样,刚说到在ANSI系统下,每种语言都有着自己符合ISO标准的编码体系,微软本来可以直接采用这套系统(注意当时Unicode还没发明),但是微软说:

“为了让Windows在世界上的任何角落都能发挥最佳的性能,我们采用了自己独有的编码体系。”(这是我编的)

这种独有的Windows编码体系被称为Code page,中文翻译为“代码页”。其实Code page是IBM的发明,只不过被微软的Windows发扬光大了。关于ANSI标准与Windows标准的差异我们不做探讨,小伙伴们同样只要记住下面两点的就行了:

一、刚才介绍的ANSI编码中,能表示西欧大多数语言的那种叫做ISO-8895-1 (Latin-1),在Windows中他则被称为Codepage-1252 (CP-1252)CP-1252“几乎”和Latin-1没有区别。唯一重要的区别是:在英语环境,Windows平台的R采用的是CP-1252而不是Latin-1编码!例如大猫先把自己的操作系统区域设置为美国,然后运行Sys.getlocale()这个函数:

> Sys.getlocale() [1] "LC_COLLATE=English_United States.1252....

其中“English_United States.1252”说明现在R的区域是美国,语言是英语,采用的默认编码格式是Windows的CP-1252

二、刚才谈到常见的中文ANSI编码有:GB2312, GBK, GB18030,大家只要知道Windows中所采被称为Codepage-936 (CP-936)就行了。具体而言,CP-936对应的是GBK\s编码,所以如果有一天有人告诉你他在Windows中选择了CP-936的编码格式,那么你就知道他实际上用的是GBK了。(当然现在的Windows在内部统一用Unicode表示字符,这个话题就太大了,不提)

中文Windows环境中运行Sys.getlocale()会得到这个结果:

Sys.getlocale()

[1] "LC_COLLATE=Chinese (Simplified)_China.936..

其中“Chinese (Simplified)_China.936 ”说明现在R的区域是中国,语言是简体中文,采用的编码格式是Windows的CP-936

  • ASCII是个古董,能表示的字符最少,且不能表示中文,几乎被淘汰。后来所有新的编码都兼容ASCII
  • ANSI是ASCII的扩展,由国际标准组织(ISO)定义,且每个语言都有一套自己的ANSI编码体系,西文中最常用的那个版本叫 ISO-8895-1 (Latin-1),也是R所支持的三大编码之一;
  • 简体中文常见ANSI类型编码有GB2312GBKGB18030
  • Windows把ISO标准的ANSI编码称为“代码页”(Code page,CP)其中ISO-8895-1 (Latin-1)在Windows中称为CP-1252,简中编码GBK被称为CP-936
  • Unicode是一类代码的统称,是出现最晚、最先进的代码系统,可以表示所有语言。UTF-8是其中最流行的编码格式,也是我们传输文件的首选。

期预告

这一期只是介绍了常见编码,下一期大猫将在本期基础上深入探索R的编码系统~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大猫的R语言课堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
>> 技术应用:MySQL - 字符编码表
在MySQL中,字符集的概念和编码方案被看做是同义词,一个字符集是一个转换表和一个编码方案的组合。
艾特
2023/10/10
2270
真棒!彻底解决了一直困扰的编码问题
在批量处理文件(后缀包括 ".csv"、".xlsx"、".xls"的文件)时,可能会出现同一个文件夹内同时存在不同编码的文件;亦或非"utf-8"格式的其他格式,即便相同格式也会出现有些文件能打开,而有些文件不能打开。
数据STUDIO
2021/06/24
1.3K0
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)
例如其中字母a的二进制位:1100 001 = 97,那么a在计算机中就可以用1100001来保存。
mingjie
2023/04/27
1.6K0
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)
架构师必须掌握的各种编码:ASCII、ISO-8859-1、GB2312...
编码在我们日常开发过程中经常有遇到,常见的编码格式有ASCII、ISO-8859-1、GB2312、GBK、GB18030、UNICODE、UTF-8、UTF-16等,其中GB2312、GBK、GB18030、UTF-8、UTF-16都可以用来表示中文,那么哪种存储中文会比较合适呢,下面会对这几种编码一一介绍便会有结论。 为什么有编码 我们知道计算机中最小的存储单位是字节(byte),一个字节所能表示的字符数又有限,1byte=8bit,一个字节最多也只能表示255个字符,而世界上的语种又多,都有各种不
Java技术栈
2018/03/30
2.2K0
关于win10下codeblock的中文乱码问题解决
乱码问题主要是因为不同平台的编码不同造成的,你是GBK/GB2312,我是UTF-8;不同的IDE应该都提供了相应的解决方案,但需要用户自己配置一下,在codeblock下解决方案如下:
码事漫谈
2024/12/20
2040
关于win10下codeblock的中文乱码问题解决
计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题
做通信的时候,或者使用IO流读写数据的时候脑袋总是晕晕乎乎的。 与计算机打交道久了,不可避免会看到“鬼画符”式的乱码,让人云里雾里的,特别烦人。
烟雨平生
2023/10/20
5.8K0
计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题
设置程序运行时的字符编码
  关于可设置的编码可参考(windows平台): https://docs.microsoft.com/zh-cn/windows/win32/Intl/code-page-identifiers
Qt君
2020/02/27
1.4K0
帮你彻底弄懂常见的中文字符编码
| 导语 本文主要介绍了业务中常见的ASCII、GB2312、GBK、GB18030、UTF8、ANSI、Latin1中文编码。如果你在业务中也曾经被乱码搞晕过,不妨我们一起探究一下。 PS:文末有今天儿童节粉丝福利活动哦! 最近我的业务中涉及到了包含中文文本的内容解析。业务场景是用户上传一个包含中文的文本文件,我们需要根据约定好的字段格式解析该文本,并将内容导入到数据库中。但用户所传上来的文件中文编码经常会不一样,于是我们的数据库中经常会有乱码出现。为了解决该问题,就有了这篇文章…… 1、字符编码要做
腾讯NEXT学位
2020/06/02
3.4K0
字符编码
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://polaris.blog.51cto.com/1146394/377468
拾点阳光
2018/09/28
2.2K0
MySQL字符编码指南--基础篇
要了解MySQL的字符编码,解决乱码问题,必须先了解字符编码。我们知道所谓信息,在计算机中不过是一串的位(bit:0 or 1),每8个bit组成了一个字节,而这些字节到底表示什么,取决于读到这些对象的上下文,1个字节序列,可以表示整数,字符串或者机器指令,当然也可以表示中文,日文,甚至上古文字。
DBA成江东
2023/07/15
8490
MySQL字符编码指南--基础篇
精述字符编码
带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK,GB18030,BIG5,BMP,Code Page,BOM,MBCS,Little Endian,Big Endian,内码,外码。
恋喵大鲤鱼
2018/08/03
1.5K0
精述字符编码
刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK
英文字母再加一些其他标点字符之类的也不会超过256个,用一个字节来表示一个字符就足够了(2^8 = 256)。但其他一些文字不止这么多字符,比如中文中的汉字就多达10多万个,一个字节只能表示256个字符,肯定是不够的,因此只能使用多个字节来表示一个字符。
笨笨阿林
2022/05/09
4.2K0
刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK
刨根究底字符编码之七——ANSI编码与代码页(Code Page)
如前所述,在全世界所有国家和民族的文字符号统一编码的Unicode编码方案问世之前,各个国家、民族为了用计算机记录并显示自己的字符,都在ASCII编码方案的基础上,设计了各自的编码方案。
笨笨阿林
2022/05/09
1.7K0
刨根究底字符编码之七——ANSI编码与代码页(Code Page)
文本编码转换工具iconv 附批量转换文件编码命令
网络上下载的好多文本是GBK的编码,在mac电脑上打开是乱码 除了下载有多种编码的文本编辑器外,通过终端也可以进行转码 iconv -f GBK -t UTF-8 原文件名 > 随便起个名 文本内容的编码:用Terminal 里的 iconv 命令批量转换文本编码到UTF8. 步骤: 1. 新建一个文件夹,在下载目录下创建文件夹 encoding ,然后将要转换的文本拉入这个文件夹。 2. 打开终端,输入以下代码: AlbertdeAir:Downloads Albert$ pwd /Users/A
Albert陈凯
2018/04/04
6.6K0
文本编码转换工具iconv 附批量转换文件编码命令
万字长文讲解编码知识,看这文就够了!
字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。一般来说我们称某个字符集里面的字符,叫xx字符,如ASCII字符集里面的ASCII字符,GB2312字符集里面的GB2312字符。
杰哥的IT之旅
2020/06/18
3.1K0
万字长文讲解编码知识,看这文就够了!
计算机程序的思维逻辑 (6) - 如何从乱码中恢复 (上)?
我们在处理文件、浏览网页、编写程序时,时不时会碰到乱码的情况。乱码几乎总是令人心烦,让人困惑。希望通过本节和下节文章,你可以自信从容地面对乱码,恢复乱码。 谈乱码,我们就要谈数据的二进制表示,我们已经在前两节谈过整数和小数的二进制表示,接下了我们将讨论字符和文本的二进制表示。 由于内容比较多,我们将分两节来介绍。本节主要介绍各种编码,乱码产生的原因,以及简单乱码的恢复。下节我们介绍复杂乱码的恢复,以及Java中对字符和文本的处理。 编码和乱码听起来比较复杂,文章也比较长,但其实并不复杂,请耐心阅读,让我们
swiftma
2018/01/31
1.3K0
计算机程序的思维逻辑 (6) - 如何从乱码中恢复 (上)?
Unicode编码
这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:
硬核编程
2019/08/19
1.4K0
我知道你不知道GB2312
这篇文章将是大猫《如何搞定头疼的编码》一文的一部分,当时本来想做一个完整的有关“R与编码”的笔记,没想到后来洋洋洒洒写了六七千字,估计一时半会也完成不了,所以先选出其中有意思的一节同大家分享。
用户7652506
2020/10/23
2.1K0
我知道你不知道GB2312
Python 编码问题详解
编码问题 为什么需要编码问题 - 本质上计算机只能识别01代码 - 如何用一长串01代码表示复杂的信息 编码简史 - 二进制 - bit: 一个0或者1的二进制数字 - byte: 八个01代码,字节 - 第一阶段: ASCII - 第二阶段:百花齐放, GB2312, GBK, BIG5, Latin1,JIS, - Latin1:兼容欧洲大多数语言 - 中国:GBxxxx - 韩国台湾: BIG5 - 日本: JIS - ANSI-MBCS(Mu
ruochen
2021/07/22
55.6K0
Python 编码问题详解
C++代码改造为UTF-8编码问题的总结
无论是哪个平台哪种编程语言,字符串乱码真是一个让人无语的问题:你说这个问题比较小吧,但是关键时刻来一下真是受不了。解决方式也有很多种,但是与其将编码转换来转换去,不如统一使用同一种编码方式,比如国际通用的UTF-8编码。因此,新的程序代码最好都统一使用UTF-8编码的方式。但是C++作为一种历史悠久的编程语言,肯定存在很多存量代码,如何将其改造成UTF-8编码也是一个问题,笔者在这里总结一二,可能不是很全,如果有遗漏就再开一篇补充。
charlee44
2025/02/13
2000
C++代码改造为UTF-8编码问题的总结
推荐阅读
相关推荐
>> 技术应用:MySQL - 字符编码表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档