热线电话:13121318867

登录
2018-11-04 阅读量: 743
R里的字符串

每个十六进制数表示信息的一个字节: 48 是 H、 61 是 a 等。从十六进制数到字符的这种映

射称为编码,这个示例中的编码方式称为 ASCII。 ASCII 可以非常好地表示英文字符,因

为它就是美国信息交换标准代码(American Standard Code for Information Interchange)的

缩写。

对于英语之外的其他语言,事情就变得更加复杂了。计算机发展的早期阶段有很多为非英

语字符进行编码的标准,它们之间甚至是相互矛盾的。要想正确表示一个字符串,不仅

需要知道它的值,还要知道其编码方式。例如, Latin1(即 ISO-8859-1, 用于西欧语言)

和 Latin2(即 ISO-8859-2,用于东欧语言)是两种常用的编码方式。字节 b1 在 Latin1

中表示“±”,但在 Latin2 中则表示“ą”!好在现在有一种几乎所有语言都支持的标准:

UTF-8。 UTF-8 可以为现在人类使用的所有字符进行编码,同时还支持很多特殊字符(如

表情符号!)。

readr 全面支持 UTF-8:当读取数据时,它假设数据是 UTF-8 编码的,并总是使用 UTF-8

编码写入数据。这是非常好的默认方式,但对于从不支持 UTF-8 的那些旧系统中产生的数

据则无能为力。遇到这种情况时,你的字符串打印出来就是一堆乱码。有时只有一两个字

符是乱码;有时则完全不知所云。例如:

x1 <- "El Ni\xf1o was particularly bad this year"
x2 <- "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd"

要想解决这个问题,需要在 parse_character() 函数中设定编码方式:

parse_character(x1, locale = locale(encoding = "Latin1"))
#> [1] "El Niño was particularly bad this year"
parse_character(x2, locale = locale(encoding = "Shift-JIS"))
#> [1] "こんにちは"

如何才能找到正确的编码方式呢?如果足够幸运,那么编码方式可能就写在数据文档中。

遗憾的是这种情况非常罕见,因此 readr 提供了 guess_encoding() 函数来帮助你找出编码

方式。但这个函数并非万无一失,如果有大量文本(不像本例),效果就会更好,它确实

是一个良好的起点。希望试验几次后,你就能够找到正确的编码方式:

guess_encoding(charToRaw(x1))
#> encoding confidence
#> 1 ISO-8859-1 0.46
#> 2 ISO-8859-9 0.23
guess_encoding(charToRaw(x2))
#> encoding confidence
#> 1 KOI8-R 0.42

guess_encoding() 的第一个参数可以是一个文件路径,也可以是一个原始向量(适用于字

符串已经在 R 中的情况),就像本示例一样。

0.0000
5
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子