美文网首页
33.关于parse系列函数之解析字符串

33.关于parse系列函数之解析字符串

作者: 心惊梦醒 | 来源:发表于2021-08-17 21:42 被阅读0次

    【上一篇:32.关于parse系列函数之解析数字】
    【下一篇:34.关于parse系列函数之解析因子】

        解析字符串看似简单,其实不然。相同的字符串可以用很多种方式表示。为了理解发生了什么,我们需要深入了解计算机是如何表示字符串的。在R中,我们可以使用charToRaw()来获得字符串的底层表示:

    > charToRaw("Hadley")
    [1] 48 61 64 6c 65 79
    

        每个十六进制数代表一个字节的信息:48是H, 61是a,等等。从十六进制数到字符的映射称为编码,在本例中称为ASCII编码。ASCII在表示英语字符方面做得很好,因为它是美国信息交换标准代码。
        除了英语,其他语言的情况变得更加复杂。在计算的早期,有许多用于编码非英语字符的竞争性标准,为了正确解释字符串,您需要知道值和编码。例如,两种常用的编码是Latin1(也就是ISO-8859-1,用于西欧语言)和Latin2(也就是ISO-8859-2,用于东欧语言)。在Latin1中,字节b1是“±”,但在Latin2中,它是“ą”!幸运的是,现在有一种标准几乎得到了所有地方的支持:UTF-8。UTF-8可以编码今天人类使用的几乎所有字符,以及许多额外的符号(比如表情符号(emoji)!)
        readr在任何地方都使用UTF-8:当您读取数据时,它假设数据是UTF-8编码的,并且总是在写入时使用它。这是一种很好的默认设置,但是对于不理解UTF-8的旧系统生成的数据,这种设置将失败。如果这种情况发生在你身上,你的字符串在打印时看起来会很奇怪。有时候只有一两个字符可能会出错;其他时候,你会完全混乱。例如:

    > x1 <- "El Ni\xf1o was particularly bad this year"
    > x1
    [1] "El Ni駉 was particularly bad this year"
    > x2 <- "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd"
    > x2
    [1] "偙傫偵偪偼"
    # 用locale参数解决问题
    > 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))
    # A tibble: 2 x 2
      encoding   confidence
      <chr>           <dbl>
    1 ISO-8859-1       0.46
    2 ISO-8859-9       0.23
    > guess_encoding(charToRaw(x2))
    # A tibble: 1 x 2
      encoding confidence
      <chr>         <dbl>
    1 KOI8-R         0.42
    
    guess_encoding的第一个参数可以是一个文件,也可以是一个raw vector
    

    【上一篇:32.关于parse系列函数之解析数字】
    【下一篇:34.关于parse系列函数之解析因子】

    相关文章

      网友评论

          本文标题:33.关于parse系列函数之解析字符串

          本文链接:https://www.haomeiwen.com/subject/lquubltx.html