2016-09-16 42 views
1

如何在R中創建一個類似「\ u0531」的UTF-8字符串,但將代碼「0531」作爲變量?UTF-8:通過字符代碼編號創建字符(字符串)

我有一個壞字符串(由「UTF-8代碼在標籤」),我想動態變成一個很好的字符串(正確的UTF-8字符串)。

badString <- "<U+0531><U+0067>" 
goodString <- "Աg" # how can I generate that by a function? 

turnBadStringToGoodString<- function (myString){ 
    newString <- gsub("<U\\+([0-9]{4})>","\\u\\1",myString) 
    newString2 <- parse(text = paste0("'", newString, "'"))[[1]] 
    return (
    newString2 
    ) 
} 

turnBadStringToGoodString (badString) 
# returns an expression. What to do next? 

請注意這期望的結果可以通過手動輸入

"\u0531\u0067" 

但怎麼可能用一個函數來完成實現?謝謝你的想法。

而且相關:Converting a \u escaped Unicode string to ASCII

回答

1

我會建議使用gsubfn用正則表達式將捕獲數字和只返回轉換後的Unicode符號:

library(gsubfn) 
badString <- "<U+0531><U+0067>" 
turnBadStringToGoodString<- function (myString){ 
    return (
    gsubfn("<U\\+(\\d{4})>", ~ parse(text = paste0("'", paste0("\\u",x), "'"))[[1]],myString) 
    ) 
} 
turnBadStringToGoodString(badString) 
[1] "Աg" 

的解釋了一下:

  • <U\\+(\\d{4})>匹配<,U,+然後捕獲到組1 4位數然後匹配>
  • 將組1中的值傳遞給回調函數(~,我們將其稱爲x),並在回調中執行轉換。
  • gsubfn處理輸入字符串中的所有非重疊匹配。
+0

看起來很乍看。將執行並確認它是否按預期工作。 :) – nilsole

+1

原來我的RStudio有問題,以正確的方式查看()'badString'。必須設置'Sys.setlocale(locale =「Russian」)'用'read.csv()'獲得正確的輸出。 HTTP:// stackoverflow.com /一個/ 34256414/2381339' – nilsole