如何使用数字字符引用解码字符

时间:2018-08-14 22:55:15

标签: r

我使用的外部实用程序使用数字字符引用对非ASCII字符编码字符串。例如,它会写“ LÍNEA”而不是“ LÍNEA”。我正在读取由该外部实用程序创建的文件,并希望能够将其使用编码字符编写的内容转换为非编码格式。

给定

char = "LÍNEA"
char2 = "LÍNEA"

如何修改char以便

char == char2
[1] TRUE

对于任何可能的编码字符

3 个答案:

答案 0 :(得分:2)

您可以使用ImmutableDictionary<int, int> d = ImmutableDictionary<int, int>.Empty; bool b = d.TryAdd(1, 1); 从R中的整数转换为intToUtf8字符,问题是找到它们并在字符串中对其进行更改。为此,我制作了一个函数,该函数使用正则表达式查找这些数字字符,并用UTF8将其转换为UTF8,然后使用intToUtf8将数字字符替换为正确的{ {1}}字符:

str_replace

由于UTF8循环,如果有多个数字sub_utf8 <- function(char) { library(stringr) while(TRUE) { utf <- str_match(char, '\\&\\#([0-9]+)\\;')[,2] if (is.na(utf)) break() char <- sub('\\&\\#([0-9]+)\\;', intToUtf8(utf), char) } return(char) } char = "L&#205;NEA" char2 = "LÍNEA" sub_utf8(char) [1] "LÍNEA" sub_utf8(char) == char2 [1] TRUE 字符,它也将起作用:

while

请注意,这需要软件包UTF8,因为据我所知,基本R regex选项均未正确支持匹配组。如有必要,可以用以下调用代替char3 = "L&#205;NE&#100;A" sub_utf8(char3) [1] "LÍNEdA" :调用stringr来查找匹配项,调用str_match来提取匹配项,并调用regexec来删除非整数字符(即, regmatches)以正确获取gsub整数值。

答案 1 :(得分:1)

执行此操作的一种方法是仅查看您拥有的文本。除了$#205;之外,所有元素都是相似的,我不知道为什么要这样做,但是在那里您会找到Í的ASCII代码205。如果您不知道ASCII码,请使用utf8ToInt('a')函数。现在解决您的问题:

iconv(sub("&#205;",intToUtf8(205),char1),'utf-8','utf8') ==char2
[1] TRUE

答案 2 :(得分:0)

我在用例中使用@divibisan的答案,但是在处理诸如表情符号字符之类的替代对时遇到了一个问题。我的解决方案是按块而不是一个接一个地处理字符。因此,allow_surrogate_pairs=TRUE函数中与intToUttf8一起处理的任何彼此相邻的编码字符

sub_decimal <- function(char){
  while(TRUE){
    # first get the character. might be in multipart
    utf <- stringr::str_extract(char, '(\\&\\#([0-9]+)\\;)+')
    if(is.na(utf)){
      break()
    }
    utf <- stringr::str_extract_all(utf,'[0-9]+')[[1]]
    char <- sub('(\\&\\#([0-9]+)\\;)+', intToUtf8(utf,allow_surrogate_pairs = TRUE), char)
  }
  return(char)
}