有人知道如何检测并替换“\x”吗R
?
library(stringr)
x <- "gesh\xfc"
str_detect(x, "\\x")
# Error in stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)) :
# Unrecognized backslash escape sequence in pattern. (U_REGEX_BAD_ESCAPE_SEQUENCE)
nchar(x)
# Error in nchar(x) : invalid multibyte string, element 1
iconv(x, "latin1", "utf-8")
# [1] "geshü"
Encoding(x)
# [1] "unknown"
会议信息:
> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6
...
locale:
[1] fr_CH.UTF-8/fr_CH.UTF-8/fr_CH.UTF-8/C/fr_CH.UTF-8/fr_CH.UTF-8
上下文:我读取了一个 .csv 文件data.table::fread()
但该文件的名称为德语,带有 ä、ö、ü 等字母。一旦在 R 中读取,这些字母就会变成以"\x"
。此后在 R 中就无法使用了。
只是总结一下这里发生的事情。 “\x”不是字符串的一部分。这就是 R 转义它无法打印的值的方式。对于“gesh\xfc”,前 4 个字符是基本 ASCII 字符,但最后一个字符被编码为“\xfc”。在 latin1 编码(Windows 默认使用)中fc
字符是“ü”字符。所以在我的 Windows 机器上,我看到
x <- "gesh\xfc"
x
# [1] "geshü"
您可以使用以下命令查看该字符串的原始字节
charToRaw("gesh\xfc")
# [1] 67 65 73 68 fc
您可以看到前 4 个值的 ASCII 十六进制字符代码,然后您可以看到\x
实际上只是用于在字符串中包含“fc”字符代码。字符串本身只有 5 个“字符”。
但如果你不使用latin1
,“fc”字符不映射到任何内容。基本上,该字符串在 Mac 默认使用的 utf-8 编码中没有任何意义。您可以使用以下命令转换为 utf-8
iconv("gesh\xfc", "latin1", "utf-8")
但由于您通过导入文本文件获得了该文件,因此问题是 R 不知道该文件的编码不是 UTF-8,因此您最终会得到这些奇怪的值。你应该告诉fread
该文件来自 Windows,因此它可以从一开始就正确导入字符串
fread(file, encoding = "Latin-1")
您需要知道使用什么编码来制作要导入的文件,尤其是由其他人制作的文件。程序实际上不可能正确猜测。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)