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