R 两个角色看起来很相似,但评价却不同。我怎样才能找出明显的差异?
我有两个序列R 两个角色看起来很相似,但评价却不同。我怎样才能找出明显的差异?,r,string,character-encoding,R,String,Character Encoding,我有两个序列s和t,当我打印它们时,它们看起来完全相同,但当我将它们与=进行比较时,R输出FALSE。我已经找到了两个字符串中26号字符的差异,并且。。。你们自己看看: > substring(s, 26, 26) [1] "–" > substring(t, 26, 26) [1] "–" > substring(s, 26, 26) == substring(t, 26, 26) [1] FALSE > substring(s, 26, 26) == "-" [1]
s
和t
,当我打印它们时,它们看起来完全相同,但当我将它们与=
进行比较时,R输出FALSE
。我已经找到了两个字符串中26号字符的差异,并且。。。你们自己看看:
> substring(s, 26, 26)
[1] "–"
> substring(t, 26, 26)
[1] "–"
> substring(s, 26, 26) == substring(t, 26, 26)
[1] FALSE
> substring(s, 26, 26) == "-"
[1] FALSE
> substring(t, 26, 26) == "-"
[1] FALSE
在最后两行中,我从键盘手动输入了破折号。很明显,这是三个不同的破折号,但有什么区别?哪个是哪个
这个问题可能是由于几个人在不同的计算机上复制粘贴不同版本的MS Word和Excel,然后我通过.csv
文件将其读入R
具体地说,我能在R中找到这两个神秘字符的代码点(或类似的东西)以便找出问题所在吗
因为它被要求:
> s
[1] "Salmonid alfavirus (SAV) – Rutinemessig prøvetaking § 4, 1. ledd (avsnitt), § 4, 2. ledd (avsnitt) & §13, 1. ledd (avsnitt)."
> t
[1] "Salmonid alfavirus (SAV) – Rutinemessig prøvetaking § 4, 1. ledd (avsnitt), § 4, 2. ledd (avsnitt) & §13, 1. ledd (avsnitt)."
(SAV)
后面的破折号是字符号26,即所讨论的字符
编辑:在回答告诉我有关charToRaw()
的内容后,我决定尝试一下。结果如下:
> charToRaw(substring(t, 26, 26))
[1] 96
> charToRaw(substring(s, 26, 26))
[1] 96
> substring(s, 26, 26) == substring(t, 26, 26)
[1] FALSE
现在我更难堪了。字符具有相同的代码点,但仍然不相等?这是怎么回事
新发展:
我将这两个字符放入它们自己的变量中,因为我厌倦了一直使用子字符串。然后我将它们与另一个的复制粘贴版本进行比较:
> a = substring(s, 26, 26)
> b = substring(t, 26, 26)
> a == b
[1] FALSE
> a
[1] "–"
> b
[1] "–"
> a == "–"
[1] FALSE
> b == "–"
[1] TRUE
因此,复制粘贴
>a
的输出将产生一个被认为等于b
的字符。很抱歉,但这也意味着,由于这篇文章是由复制粘贴的代码组成的,因此在这篇文章中出现的破折号实际上可能是相同的。我自己不使用R,但您可以找到在R中获取ascii代码的说明
使用问题中的复制粘贴和Python,我发现两个字符串中的“-”实际上是3个字符:
for l in "AV) – Rut": #copy-pasted from the question
print(l, ord(l))
('A',65)
(V',86)(""),41(",32"("x 2",226)(""x 80
('\x93',147)('',32)('R',82)('u',117)('t',116)
你的两个版本给出了相同的答案,这很奇怪。但两者都不同于常规短跑:
for l in "-": # With the normal dash typed myself
print(l, ord(l))
(“-”,45)
您将找到与('\xe2',226)('\x80',128)('\x93',147)相对应的字符。尝试此操作,并在可以通过google找到的字符代码表中查找十六进制值
charToRaw("hello")
## [1] 68 65 6c 6c 6f
s请显示什么是s
和t
。可能符号不同。您需要在问题中添加s和t字符串。所以,我们可以看到哪里出了问题。我在另一个答案中也看到了charToRaw()。结果,两个破折号都给出了96
(而键盘破折号给出了2d
),但根据=
,它们仍然拒绝相等。您也可以根据链接中的asc()
函数(以及它们直接应用的charToRaw()
函数)尝试utf8ToInt
,它们是相等的。然而,根据==
,他们仍然拒绝评估为相等。是的,我从一开始就非常确定常规破折号是不同的。如果你仔细看,你会发现它比较短。此外,我意识到复制粘贴使两个神秘的破折号实际上相等,因此我无法在此发布其中一个供您使用。这就是为什么子字符串测试的计算结果为TRUE
。
s <- "Salmonid alfavirus (SAV) – Rutinemessig prøvetaking § 4, 1. ledd (avsnitt), § 4, 2. ledd (avsnitt) & §13, 1. ledd (avsnitt)."
t <- "Salmonid alfavirus (SAV) – Rutinemessig prøvetaking § 4, 1. ledd (avsnitt), § 4, 2. ledd (avsnitt) & §13, 1. ledd (avsnitt)."
substring(s, 26, 26) == substring(t, 26, 26)
#[1] TRUE
substring(s, 26, 26)
#[1] "–"
substring(t, 26, 26)
#[1] "–"
## comparing dash in string with regular dash on keyboard
substring(s, 26, 26) == "-"
#[1] FALSE
substring(t, 26, 26) == "-"
#[1] FALSE
asc <- function(x) {strtoi(charToRaw(x),16L)}
asc(substring(s, 26, 26))
#[1] 226 128 147
asc("-")
#[1] 45