我有一个文本文件,其中包含一些Unicode字符的回退转换(以尖括号表示的Unicode代码点)。因此,它包含例如foo<U+017E>bar
应该是"foošbar"。是否有一种简单的方法在R中将整个文件转换为UTF8,并将这些字符转换?不幸的是,我在Windows上并找不到受支持的UTF-8区域设置。
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到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 "
\u
可以接受最多四个数字。例如,其他答案中提出的解决方案将无法正确处理"<U+102A0>"
,将其转换为\u102A0
,即字符<U+102A>
后跟一个字面上的零。此外,如果代码点未被特殊地填充为四位数字,则会出现问题:stri_unescape_unicode()
要求\u
后跟四个数字(\U
后跟八个数字)。 - mvkorpelstri_unescape_unicode
非常严格:它只接受 \u1234
或 \U12345678
。\U102A0
会抛出错误。我很高兴我问了,谢谢! - Benjaminstri_replace_all_regex("<U\\+([[:alnum:]]{1,8})>", "\\\\U$1")
来替换原始的解决方案。 - Benjamin
foošbar
而不会有任何转换问题。你确定问题不是RStudio或RRO的显示字体吗? - Panagiotis KanavosSys.setlocale("LC_ALL", 'en_US.UTF-8')
这样的东西不起作用,我不知道为什么。所以,无论文件采用哪种编码方式,我都会遇到这个问题。 - user43018Sys.setlocale
实际上是一种R解决方案,允许使用ANSI编译的软件包处理Unicode数据-只要它们不尝试检查值。例如,我没有问题从文件中输入或加载“foošbar”。但某些软件包在处理加载的文本时会出现错误,而其他软件包则没有问题。甚至有一些混合使用Unicode和ANSI代码的情况。 - Panagiotis Kanavos