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

时间:2013-12-08 20:44:37

标签: r unicode encoding unicode-normalization latin

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

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

> "\u00e9"
[1] "é"
> "\u0065\u0301"
[1] "é"

然而,当然:

> "\u00e9" == "\u0065\u0301"
[1] FALSE

R中是否有一个将两个unicode-characters-letters转换为单字符形式的函数?特别是,它会将"\u0065\u0301"折叠为"\u00e9"

处理大量字符串非常方便。此外,单字符表单可以通过iconv轻松转换为其他编码 - 至少对于通常的Latin1字符 - 并且由plot更好地处理。

提前多多感谢。

1 个答案:

答案 0 :(得分:11)

好吧,似乎已经开发了一个包来增强和简化R中的字符串操作工具箱(最后!)。它被称为stringi,看起来很有希望。其documentation编写得非常好,特别是我发现有关encodingslocales的网页比某些标准R documentation on the subject更具启发性。

它具有Unicode规范化功能,正如我所寻找的(此处为C形式):

> stri_trans_nfc('\u00e9') == stri_trans_nfc('\u0065\u0301')
[1] TRUE

它还包含一个智能comparison function,它集成了这些规范化问题,减轻了不得不考虑它们的痛苦:

> 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.

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