我使用的外部实用程序使用数字字符引用对非ASCII字符编码字符串。例如,它会写“ LÍNEA
”而不是“ LÍNEA
”。我正在读取由该外部实用程序创建的文件,并希望能够将其使用编码字符编写的内容转换为非编码格式。
给定
char = "LÍNEA"
char2 = "LÍNEA"
如何修改char
以便
char == char2
[1] TRUE
对于任何可能的编码字符
答案 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ÍNEA"
char2 = "LÍNEA"
sub_utf8(char)
[1] "LÍNEA"
sub_utf8(char) == char2
[1] TRUE
字符,它也将起作用:
while
请注意,这需要软件包UTF8
,因为据我所知,基本R regex选项均未正确支持匹配组。如有必要,可以用以下调用代替char3 = "LÍNEdA"
sub_utf8(char3)
[1] "LÍNEdA"
:调用stringr
来查找匹配项,调用str_match
来提取匹配项,并调用regexec
来删除非整数字符(即, regmatches
)以正确获取gsub
整数值。
答案 1 :(得分:1)
执行此操作的一种方法是仅查看您拥有的文本。除了$#205;
之外,所有元素都是相似的,我不知道为什么要这样做,但是在那里您会找到Í
的ASCII代码205
。如果您不知道ASCII码,请使用utf8ToInt('a')
函数。现在解决您的问题:
iconv(sub("Í",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)
}