2016-09-16 68 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