R中的Unicode规范化(表单C):将带有重音符号的所有字符转换为它们的单一字符形式?

Alx*_*lxH 13 unicode encoding r latin unicode-normalization

在Unicode中,带有重音的字母可以用两种方式表示:强调字母本身,以及裸字母加上重音的组合.例如,é(+ U00E9)和e'(+ U0065 + U0301)通常以相同的方式显示.

R呈现以下内容(版本3.0.2,Mac OS 10.7.5):

> "\u00e9"
[1] "é"
> "\u0065\u0301"
[1] "é"
Run Code Online (Sandbox Code Playgroud)

但是,当然:

> "\u00e9" == "\u0065\u0301"
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

R中是否有一个将两个unicode字符转换成单字符形式的函数?在这里特别地,它会坍塌"\u0065\u0301""\u00e9".

这对处理大量字符串非常方便.另外,单字符表单可以很容易地转换为其他编码iconv- 至少对于通常的Latin1字符 - 并且更好地处理plot.

非常感谢提前.

Alx*_*lxH 12

好吧,似乎已经开发了一个包来增强和简化R中的字符串操作工具箱(最后!).它被称为stringi,看起来非常有前景.它的文档编写得非常好,特别是我发现有关编码语言环境的页面比关于该主题的一些标准R文档更具启发性.

它有Unicode规范化功能,正如我所寻找的(这里是C形式):

> stri_trans_nfc('\u00e9') == stri_trans_nfc('\u0065\u0301')
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

它还包含一个智能比较功能,它集成了这些规范化问题,减轻了必须考虑它们的痛苦:

> stri_compare('\u00e9', '\u0065\u0301')
[1] 0
# i.e. equal ;
# otherwise it returns 1 or -1, i.e. greater or lesser, in the alphabetic order.
Run Code Online (Sandbox Code Playgroud)

感谢开发人员MarekGągolewski和Bartek Tartanus以及Kurt Hornik的信息!

  • 因为我通过`iconv()`在R上搜索德国OSX上的变音符号来找到你的答案,所以使用`stringi`包它只是一个函数可能是值得的:`stringi :: stri_trans_general(c("äöüø" ), "拉丁-ASCII")` (3认同)
  • stringi现在在[CRAN]上(http://cran.r-project.org/web/packages/stringi/). (2认同)