2016-10-04 199 views
0

我有一個文本文件,其中包含某種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

回答

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

+0

不需要轉換,Windows本身使用Unicode。另一方面,R包會混淆Unicode和ANSI代碼。更糟的是,許多R軟件包不能識別編碼,而是嘗試從系統的語言環境或語言中猜測。當嘗試讀取多個Unicode編碼,甚至多個日期和數字格式時,這很重要 –

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 "