由于R中特定于语言的特殊字符,如何更正字符串中的额外字符?

由于R中特定于语言的特殊字符,如何更正字符串中的额外字符?,r,encoding,double-byte,R,Encoding,Double Byte,我有两个几乎相等的字符串。他们看起来一样 str1<-"Diş Hekimliği Fakültesi" str2<-"Diş Hekimliği Fakültesi" 每个特定于语言的特殊字符计为两个字符。我怎样才能把str1变成str2?我唯一的手动解决方案是使用gsub 不幸的是,我不能把这个例子全部带到这里。当您尝试复制粘贴代码时,它将同时包含23个字符。这里有复制粘贴功能。iconv功能是一个系统特定的功能,用于管理国际编码之间的音译。有一个函数iconvlist,

我有两个几乎相等的字符串。他们看起来一样

str1<-"Diş Hekimliği Fakültesi"
str2<-"Diş Hekimliği Fakültesi"
每个特定于语言的特殊字符计为两个字符。我怎样才能把str1变成str2?我唯一的手动解决方案是使用gsub

不幸的是,我不能把这个例子全部带到这里。当您尝试复制粘贴代码时,它将同时包含23个字符。这里有复制粘贴功能。

iconv功能是一个系统特定的功能,用于管理国际编码之间的音译。有一个函数iconvlist,可以返回操作系统设备使用的名称向量;在sapply的帮助下,我在我的系统上运行了所有419个这样的编码,并尝试查看是否可以将str1 23个字符转换为26个字符,或者将str1 23个字符转换为26个字符,并在我的机器上找到了两个这样的编码。由于我使用Mac,我无法保证这些特定值对您有效,因为您没有透露您的操作系统状态:

我能够用上面的str2的strsplit结果输出一个MWE:

考虑到str1作为一个23个字符的对象启动后,反过来可能会成功,我成功地尝试了:

> iconv(str3c,from="UTF-8-MAC", to="UTF-8")
[1] "Diş Hekimliği Fakültesi"
> nchar(iconv(str3c,from="UTF-8-MAC", to="UTF-8"))
[1] 23
查看is可以看到{10081,x-mac-turkish},/*turkish mac*/的列表。如果你在温多泽,也许可以试试

================

在下面的早期研究中,我认为了解如何分离字符值是有用的

嗯。事实上,我可以用上面的东西来组合一个MWE:

str1<-"Diş Hekimliği Fakültesi"
str3 <- scan(what="")
#1: "D" "i" "s" "̧"   " " "H" "e" "k" "i" "m" "l" "i" "g" "̆"   "i" " " "F" "a" "k" "u" "̈"   "l" "t" "e" "s" "i"
#27: 
#Read 26 items
> str3c <- paste0(str3, collapse="")
> nchar(str3c)
[1] 26
> str1
[1] "Diş Hekimliği Fakültesi"
因此,请看代表第三个字母的三个原始项。第二种表示法似乎使用了一个基本字符,该字符使用十六进制cc对其进行退格,然后打印下行字符。现在看看我们是否能用正则表达式识别它们:

 rawToChar( charToRaw(str3c) [3])
#[1] "s"
 rawToChar( charToRaw(str3c) [4])
#[1] "\xcc"
 rawToChar( charToRaw(str3c) [5])
#[1] "\xa7"
 grep("s\\xcc\\xa7", str3c)
#[1] 1   # Success!
这是一个gsub,我认为它可能比你在使用这些单词的拆分版本时得到的结果更有效:

gsub("s\\xcc\\xa7", "\\c5\\9f", str3c)
#[1] "Diş Hekimliği Fakültesi"

还要注意的是,在R告诉你有26个字符的那一个中实际上有29个原始条目,而在假设有23个字符的那一个中有26个。我认为这三个cc Backspace实际上没有被计数。

不要复制控制台输出,而是向我们展示dputstr1、encodingstr1、encodingstr2和dputstr2。不幸的是,dput给出了相同的输出。它只有在我执行strsplit或复制粘贴到文本编辑器时才可见。我搜索了很多关于编码、ascii和其他的东西,但没有找到任何结果。它们的编码是相同的吗?我应该要求输入Encodingstr1和encodingstr2,我想我成功地创建了一个MWE。你能试试吗?它还有一个额外的空格字符,但仍然是MWE添加了iconv标签,以帮助可能搜索此主题的人。抱歉,但我已经表示我已经可以在ps之前完成最后一句:我的问题更倾向于将来的一般解决方案。分离应该是有原因的,也许有一个软件包可以处理这些不便。@berkorbay:我认为iconv有希望成为更普遍的解决方案。我也试过了。如果我没有错的话,你需要知道确切的源代码编码,才能转换成你想要的编码。我还尝试了一个名为tau的包来估计编码,但没有效果。
str1<-"Diş Hekimliği Fakültesi"
str3 <- scan(what="")
#1: "D" "i" "s" "̧"   " " "H" "e" "k" "i" "m" "l" "i" "g" "̆"   "i" " " "F" "a" "k" "u" "̈"   "l" "t" "e" "s" "i"
#27: 
#Read 26 items
> str3c <- paste0(str3, collapse="")
> nchar(str3c)
[1] 26
> str1
[1] "Diş Hekimliği Fakültesi"
> ?charToRaw
> charToRaw(str3c)
 [1] 44 69 73 cc a7 20 48 65 6b 69 6d 6c 69 67 cc 86 69 20 46 61 6b 75 cc 88 6c 74 65
[28] 73 69
> charToRaw(str1)
 [1] 44 69 c5 9f 20 48 65 6b 69 6d 6c 69 c4 9f 69 20 46 61 6b c3 bc 6c 74 65 73 69
 rawToChar( charToRaw(str3c) [3])
#[1] "s"
 rawToChar( charToRaw(str3c) [4])
#[1] "\xcc"
 rawToChar( charToRaw(str3c) [5])
#[1] "\xa7"
 grep("s\\xcc\\xa7", str3c)
#[1] 1   # Success!
gsub("s\\xcc\\xa7", "\\c5\\9f", str3c)
#[1] "Diş Hekimliği Fakültesi"