从R中的raw进行字符转换会产生不想要的结果



我有一个web响应以原始格式返回,我无法正确编码。它包含以下值:

ef bc 86

该字符应该是一个全宽&符号(如下所示):

> as.character("uFF06")
[1] "&"
> charToRaw("uFF02")
[1] ef bc 82

然而,无论我尝试了什么,它都会转换为"。说明:

> rawToChar(charToRaw("uFF02")) 
[1] """

由于原始值的等效性,我不认为我可以在我的网络呼叫中做任何事情来影响我所遇到的问题(很高兴被纠正)。我想我需要弄清楚如何正确地进行字符编码。

我还采取了一种极端的方法,尝试所有其他编码如下,但没有转换为全宽度&符号:

> x_raw <- charToRaw("uFF02")
> x_raw
[1] ef bc 82
> sapply(
+     stringi::stri_enc_list()
+     ,function(encoding) stringi::stri_encode(str = x_raw, encoding)
+ ) |> # R's new native pipe
+     tibble::enframe(name = "encoding") 
# A tibble: 1,203 x 2
encoding value          
<chr>    <chr>          
1 037      "Õ¯b"          
2 273      "Õ¯b"          
3 277      "Õ¯b"          
4 278      "Õ¯b"          
5 280      "Õ¯b"          
6 284      "Õ¯b"          
7 285      "Õ~b"          
8 297      "Õ¯b"          
9 420      "u001au001ab"
10 424      "u001au001ab"
# ... with 1,193 more rows

我目前的工作是替换编码后的字符串,但这个字符只是许多例子中的一个,硬编码每个实例似乎不实用。

> rawToChar(x_raw)
[1] """
> stringr::str_replace_all(rawToChar(x_raw), c(""" = "uFF06"))
[1] "&"

替代解决方案也很复杂,我也有字符像连字符(不是连字符减去)以某种方式被转换,其中最后一个原始值被转换为一个字符串,似乎是八进制值:

> as.character("u2010") # HYPHEN
[1] "‐"
> as.character("u2010") |> charToRaw() # As raw
[1] e2 80 90
> as.character("u2010") |> charToRaw() |> rawToChar() # Converted back to string
[1] "â€u0090"
> charToRaw("â200220") # string with equivalent raw
[1] e2 80 90

感谢您的帮助。

我不完全清楚你到底想做什么,但问题是得到你的原始字符是R不能从原始字节自动确定编码。我假设你使用的是Windows。如果你这样做

val <- rawToChar(charToRaw("uFF06")) 
val
# [1] "&"
Encoding(val)
# [1] "unknown"
Encoding(val) <- "UTF-8"
val
# [1] "&"

只要确保正确设置编码即可。

最新更新