将`�`字符串转换为R中的菱形问号符号(�)

Convert `�` string to diamond question mark symbol (�) in R

我一直在使用 googlesheets 包从网页上传和下载数据。以前,它一直在下载带有图标 � 的非 ASCII 符号的字符串。现在,不知为何,它开始使用以下字符串下载它们:�。如何将 � 转换为菱形问号 (�)?

您可能遇到了编码问题。我怀疑原始数据是用 UTF-8 编码的,但在某些时候它被视为 Windows-1252.

这是编码错误标记为Windows-1252,然后转换为UTF-8时发生的情况:

x <- "Here is a raw string: � is getting converted to �"
(y <- iconv(x, "WINDOWS-1252", "UTF-8"))
#> [1] "Here is a raw string: � is getting converted to �"

您可以通过从 UTF-8 转换为 Windows-1252,然后将结果标记为 UTF-8 来修复编码错误:

z <- iconv(y, "UTF-8", "WINDOWS-1252")
Encoding(z) <- "UTF-8"
print(z)
#> [1] "Here is a raw string: � is getting converted to �"

注意:如果您省略 Encoding(z) <- "UTF-8" 行,代码在 MacOS 和 Linux 上仍然有效,但它会在 Windows 上中断。如果您省略该行,则 z 将具有 "unknown" 编码,在 Linux 和 MacOS 上被解释为 "UTF-8" 但在 Windows.[=32 上则不会=]

Windows 用户

如果您使用的是 Windows,那么修复会简单得多。如果您的数据具有 "unknown" 编码,那么在 MacOS 和 Linux 上它将(正确地)解释为 UTF-8,但在 Windows 上它将使用您的本机编码进行解释,通常 Windows-1252。如果您在 Windows,则会发生类似以下的情况:

x <- "Here is a raw string: � is getting converted to �"
y <- x
Encoding(y) <- "unknown"
print(y)
#> [1] "Here is a raw string: � is getting converted to �"

您可以按如下方式解决此问题:

z <- y
Encoding(z) <- "UTF-8"
print(z)
#> [1] "Here is a raw string: � is getting converted to �"