当我从一个希腊站点(数据也包含希腊字符)获取数据时,我期望第一个值是“ΚΡΗΤΗ”,但我收到了以下字符串“ΚΡΗΤΗ”。
当我试图找出问题时,我测试了以下内容:
charToRaw("ΚΡΗΤΗ")
[1] ce 9a ce a1 ce 97 ce a4 ce 97
charToRaw("ΚΡΗΤΗ")
[1] ce 9a ce a1 ce 97 ce a4 ce 97
起初看起来是一回事。问题是每个希腊字符都包含两个字节的信息,如下所示:
charToRaw("Κ")
[1] ce 9a
但是当我尝试相反的事情时,即使用 rawToChar 将两个原始字节转换回字符时,我遇到了以下问题,两个字节中的每一个都被转换为一个字符。
rawToChar(as.raw(c(0xce, 0x9a)))
[1] "Κ"
因此,我试图找出是否可以强制 rawToChar 使用 2 个字节作为一个值,但我找不到方法。这让我编写了一个自定义函数以实现我的目标,但不幸的是我遇到了一个新问题。使用从站点获取的数据的第一个值作为 charToRaw 的输入,如果我复制值的内容并将其用作 charToRaw 的输入,上述函数会给出不同的输出。您可以在以下代码段中看到:
> data$area[1]
[1] "ΚΡΗΤΗ"
> copiedValue = "ΚΡΗΤΗ"
> copiedValue
[1] "ΚΡΗΤΗ"
> identical(data$area[1], copiedValue)
[1] TRUE
> charToRaw(data$area[1])
[1] c3 8e c5 a1 c3 8e c2 a1 c3 8e e2 80 94 c3 8e c2 a4 c3 8e e2 80 94
> charToRaw(copiedValue)
[1] ce 9a ce a1 ce 97 ce a4 ce 97
最后我尝试了“iconv”函数和许多不同的编码,但这似乎都没有解决问题。
iconv("ΚΡΗΤΗ", from = "Windows-1252", to = "UTF8")
[1] "ΚΡΗΤΗ"
> iconv("ΚΡΗΤΗ", from = "UTF8", to = "Windows-1252")
[1] NA