将utf8代码点字符串转换为utf8 转换为utf8

问题描述:

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

+0

UTF8是一种编码,* NOT *是语言环境。无论如何,Windows自2000年起至少使用Unicode。 R包虽然混合了Unicode和ANSI代码,然后依靠更改本地化设置来处理什么是编码问题。你真的尝试了什么?不同的软件包有不同的怪癖。他们中有些人不幸混淆了语言和编码 –

+0

什么是*文件的*编码和内容?它是否使用Unicode编码之一?然后它可以包含'foošbar'而不存在任何转换问题。你确定问题不是RStudio或RRO的显示字体吗? –

+0

我的问题是我无法在Windows上切换到UTF-8友好区域;像'Sys.setlocale(“LC_ALL”,'en_US.UTF-8')'不工作,不知道为什么。所以我有这个问题无论编码文件是。 – user43018

也许:

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上)。

+0

不需要转换,Windows本身使用Unicode。另一方面,R包会混淆Unicode和ANSI代码。更糟的是,许多R软件包不能识别编码,而是尝试从系统的语言环境或语言中猜测。当尝试读取多个Unicode编码,甚至多个日期和数字格式时,这很重要 –

当代码点正好用四位数表示时,上一个答案应该可以工作。这是一个修改后的版本,应该适用于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 "