• Posts tagged "ascii"

Blog Archives

R语言中的ASCII码

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹,分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-ascii/

前言

ASCII是计算机中最重要的字符集,我们键盘就是ASCII的子集,由26个字母、数字、符号、控制键组成,用127个基础代码就能展示出绚烂多彩的计算机世界,基础中的基础,核心中的核心。

目录

  1. ASCII介绍
  2. ASCII码转换
  3. ASCII码比大小

1. ASCII介绍

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,共收录了 128 个字符,用一个字节就可以存储,它等同于国际标准 ISO/IEC 646。

ASCII 编码于 1967 年第一次发布,最后一次更新是在 1986 年,迄今为止共收录了 128 个字符,包含了基本的拉丁字母(英文字母)、阿拉伯数字(也就是 1234567890)、标点符号(,.!等)、特殊符号(@#$%^&等)以及一些具有控制功能的字符。ASCII 编码是美国人给自己设计的,他们并没有考虑欧洲那些扩展的拉丁字母,也没有考虑韩语、日语、中文。ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。

ASCII码大致可以分作三部分组成。

  • 第一部分:ASCII非打印控制字符0~31及127(共33个),是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
  • 第二部分:ASCII打印字符32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字;65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等
  • 第三部分:扩展ASCII打印字符,后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。

同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

2. R语言ASCII码转换

在R语言中,可以使用 charToRaw() 函数用于将给定的字符转换为其相应的ASCII值或原始对象。


# 转换字符到ASCII码
> charToRaw("A")
[1] 41

> charToRaw("ABCD")
[1] 41 42 43 44

这里要注意,A的输出结果为41,与ASCII码中A的值65不一致,是因为charToRaw()函数是以十六进制输出的,再把十六进制转十进制,结果为65。关于R语言进制转换,请参考文章用R语言进制转换-二进制八进制十六进制


# 转十进制显示
> strtoi(charToRaw("A"), 16L)
[1] 65

> strtoi(charToRaw("ABCD"), 16L)
[1] 65 66 67 68

ASCII的双向转换,可以使用rawToChar()函数,将ASCII转成字符串。


# 定义一个字符串
> x <- "A test string";x
[1] "A test string"

# 判断是ASCII
> is.raw(x)
[1] FALSE

# 转ASCII
> y <- charToRaw(x);y
 [1] 41 20 74 65 73 74 20 73 74 72 69 6e 67

# 判断是否向量
> is.vector(y)
[1] TRUE

# 把ASCII转字符串
> rawToChar(y)
[1] "A test string"

# 判断是ASCII
> is.raw(y)
[1] TRUE

建立ASCII编码检查函数isASCII(),用于判断是否都是ASCII码字符。


> # ASCII检查
> isASCII <-  function(txt) {
+   all(charToRaw(txt) <= as.raw(127))
+ }

进行ASCII编码检查


> x <- "A test string";x
[1] "A test string"

# 检查x
> isASCII(x)  # true
[1] TRUE

# 随意字符
> isASCII("78fdaj djfakkje AKI&(*&(*&(*&(*,\\")
[1] TRUE

# 使用Latin-1字符集,检查失败
> isASCII("\xa325.63")
[1] FALSE

# 使用中文字符集,检查失败
> isASCII("你好")
[1] FALSE

3. 字符比大小

通常编程语言都支持字符比较大小,字符串与字符串比较原理其实都是比较单个字符的ASCII码值。比如,A和B比较大小,A对应65,B对应66,A应该是小于B的。

在比较字符串时,设置一个计数器,从零开始,一直循环到最短的那个字符结束,一位一位进行比较。

  • 如果字符串1的第n位的ASCII码值 等于 字符串2的第n位的ASCII码值,则继续比较下一位。
  • 如果字符串1的第n位的ASCII码值 大于 字符串2的第n位的ASCII码值,则字符串1 > 字符串2;
  • 如果字符串1的第n位的ASCII码值 小于 字符串2的第n位的ASCII码值,则字符串1 < 字符串2;
  • 如果每一位的ASCII码值都相等,而且长度相同, 则字符串1 == 字符串2

用R语言实现比较A和B。


> strtoi(charToRaw("AB"), 16L)
[1] 65 66
> x<-"A"
> y<-"B"
> x>y
[1] FALSE

比较2个字符串,ABCDE和ABCD,当比较到E时,字符串2第5位计0,字符串1第5位E为69,则x>y。


> strtoi(charToRaw("ABCDEE"), 16L)
[1] 65 66 67 68 69 69
> x<-"ABCDE"
> y<-"ABCD"
> x>y
[1] TRUE

比较2个字符,A和a,A的ASCII码为65,a的ASCII码为97,应该A小于a,但结果正好相反。


> strtoi(charToRaw("Aa"), 16L)
[1] 65 97
> x<-"A"
> y<-"a"
> x>y
[1] TRUE

# 比较A和a
> "A">"a"
[1] TRUE

> "a">"A"
[1] FALSE

出意外了!!!!目前还没有找到原因,希望有了解的朋友,给我留言。

本文我们了解ASCII的定义,和在R语言中的转换方法。在做文字处理的过程中,会有大量的操作离不开ASCII编码的使用。

转载请注明出处:
http://blog.fens.me/r-ascii/

打赏作者