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

  显示原文与译文双语对照的内容
0 0

我有两个实际上等价的字符串。 他们看起来一样。


str1<-"Diş Hekimliği Fakültesi"
str2<-"Diş Hekimliği Fakültesi"

但是当我尝试 nchar() 时,它们分别返回 26和 23字符。 当我使用 strsplit() 时;


strsplit(str1,split="")
[[1]]
 [1]"D""i""s""̧""""H""e""k""i""m""l""i""g""̆""i""""F""a""k""u""̈""l""t""e""s""i"

strsplit(str2,split="")
[[1]]
 [1]"D""i""ş""""H""e""k""i""m""l""i""ğ""i""""F""a""k""ü""l""t""e""s""i"

每种语言特定的特殊字符被计算为两个字符。 我怎样才能使str1变成 str2? 我唯一的手动解决方案是使用 gsub()

很遗憾,我不能把这个例子带到这里。 当你尝试复制粘贴代码时,它将是 23 characers 。 这里有复制粘贴的东西。

时间: 原作者:

0 0

iconv 函数是一个系统特定功能,用于管理国际编码中的音译。 我可以在系统中返回 iconvlist的名称,并在我的系统中找到了两个这样的编码,或者在我的机器上找到了两个这样的编码。 由于我使用 Mac,因这里无法保证这些特定值为你工作,因为你没有透露操作系统状态:

我能够将一个:组合在一起,只能从上面的strsplit -result输出来完成,


str1<-"Diş Hekimliği Fakültesi"
str3 <- scan(what="")
"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"

许多错误消息( 由于封闭 try() 而不停止执行,我得到了 2个使用这里代码的编码的列表):


?iconv
which(sapply( try(utils::head(iconvlist(), n = 419)), function(xc) 
 try(nchar(iconv(str1, to=xc))))==26)
#--------snipped large number of error messages-------
Error in nchar(iconv(str1, to = xc)) : invalid multibyte string 1
UTF-8-MAC UTF8-MAC 
 400 402 

然后认为反向可能成功( str1作为一个 23-char 对象开始) 我成功尝试:


> 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

看看网页的Windows 网页is是看到一个清单,有一个列表。{10081,"x-mac-turkish"},/* Turkish (Mac) */ 如果你在Windoze上,可能会尝试。

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

下面的研究( 我认为,了解如何提取字符值是很有用的。)

好吧,我实际上可以在上面加上你的东西,把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"

现在要做一些角色攻击:


>?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

那么看看三个代表你的第三个字母的原始项目。 看起来,第二个表示使用了一个基本字符,它使用十六进制的backspaces,然后打印下降。 现在看看我们是否能用 正规表达式 识别它们:


 rawToChar( charToRaw(str3c) [3])
#[1]"s"
 rawToChar( charToRaw(str3c) [4])
#[1]"xcc"
 rawToChar( charToRaw(str3c) [5])
#[1]"xa7"
 grep("sxccxa7", str3c)
#[1] 1 # Success!

这里有一个 gsub,我认为如果你使用这些词的分割版本,可以能比你最后的效率更高:


gsub("sxccxa7","c59f", str3c)
#[1]"Diş Hekimliği Fakültesi"

还要注意,R 中实际上有 29个原始条目告诉你有 26个"字符"( 第一个是 26,第一个是 23 ) 。 我认为这三个 cc ( backspaces ) 并没有被。

原作者:
...