将utf8代码点字符串(如<u + 0161>)转换为utf8

时间:2016-10-04 08:42:32

标签: r utf-8

我有一个文本文件,其中包含Unicode字符的某种回退转换(尖括号中的Unicode代码点)。所以它包含例如foo<U+017E>bar应该是“foošbar”。在R中是否有一种简单的方法可以将这些字符转换为整个文件转换为UTF8?不幸的是我在Windows上找不到支持的UTF-8语言环境。

2 个答案:

答案 0 :(得分:2)

也许:

library(stringi)
library(magrittr)

"foo<U+0161>bar and cra<U+017E>y" %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]+)>", "\\\\u$1") %>% 
  stri_unescape_unicode() %>% 
  stri_enc_toutf8()
## [1] "foošbar and cražy"

可能有效(我不需要在macOS上进行最后一次转换,但您可能在Windows上)。

答案 1 :(得分:0)

当代码点正好显示四位数时,上一个答案应该有效。这是一个修改后的版本,适用于1到8之间的任意数字。

library(stringi)
library(magrittr)

"foo<U+0161>bar and cra<U+017E>y, Phoenician letter alf <U+10900>" %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]{4})>", "\\\\u$1") %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]{5})>", "\\\\U000$1") %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]{6})>", "\\\\U00$1") %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]{7})>", "\\\\U0$1") %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]{8})>", "\\\\U$1") %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]{1})>", "\\\\u000$1") %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]{2})>", "\\\\u00$1") %>% 
  stri_replace_all_regex("<U\\+([[:alnum:]]{3})>", "\\\\u0$1") %>% 
  stri_unescape_unicode() %>% 
  stri_enc_toutf8()
## [1] "foošbar and cražy, Phoenician letter alf "