gpt4 book ai didi

r - 如何在 R Windows 中将 Unicode 字符串写入文本文件?

转载 作者:行者123 更新时间:2023-12-04 12:40:00 24 4
gpt4 key购买 nike

我已经想出了如何编写 Unicode 字符串,但仍然对它的工作原理感到困惑。

str <- "ỏ"
Encoding(str) # UTF-8
cat(str, file="no-iconv") # Written wrongly as <U+1ECF>
cat(iconv(str, to="UTF-8"), file="yes-iconv") # Written correctly as ỏ

我明白为什么 no-iconv方法不起作用。因为 cat (还有 writeLines) convert the string into the native encoding first and then to the to= encoding .在 Windows 上,这意味着 R 转换 Windows-1252第一,看不懂 ,导致 <U+1ECF> .

我不明白为什么 yes-iconv方法有效。如果我理解正确,是什么 iconv这里所做的只是返回一个带有 UTF-8 的字符串编码。但是 str已经在 UTF-8 !为什么要 iconv有什么区别吗?另外,当 iconv(str, to="UTF-8")传递给 cat , 不应该 cat首先转换为 Windows-1252 再次搞砸一切?

最佳答案

我认为设置(副本)str 的编码至 "unknown"使用前 cat()不那么神奇,效果也一样。我认为应该避免在 cat() 中进行任何不需要的字符集转换.

这是一个扩展示例,用于演示我认为在原始示例中发生的情况:

print_info <- function(x) {
print(x)
print(Encoding(x))
str(x)
print(charToRaw(x))
}

cat("(1) Original string (UTF-8)\n")
str <- "\xe1\xbb\x8f"
Encoding(str) <- "UTF-8"
print_info(str)
cat(str, file="no-iconv")

cat("\n(2) Conversion to UTF-8, wrong input encoding (latin1)\n")
## from = "" is conversion from current locale, forcing "latin1" here
str2 <- iconv(str, from="latin1", to="UTF-8")
print_info(str2)
cat(str2, file="yes-iconv")

cat("\n(3) Converting (2) explicitly to latin1\n")
str3 <- iconv(str2, from="UTF-8", to="latin1")
print_info(str3)
cat(str3, file="latin")

cat("\n(4) Setting encoding of (1) to \"unknown\"\n")
str4 <- str
Encoding(str4) <- "unknown"
print_info(str4)
cat(str4, file="unknown")

"Latin-1" R 在 Windows 上使用的语言环境(参见 ?l10n_info),输出文件 "yes-iconv" , "latin""unknown"应该是正确的(字节序列 0xe10xbb0x8f"ỏ" )。

"UTF-8"语言环境、文件 "no-iconv""unknown"应该是正确的。

示例代码的输出如下,使用在 Wine 上运行的 R 3.3.2 64 位 Windows 版本:
(1) Original string (UTF-8)
[1] "ỏ"
[1] "UTF-8"
chr "<U+1ECF>""| __truncated__
[1] e1 bb 8f

(2) Conversion to UTF-8, wrong input encoding (latin1)
[1] "á»\u008f"
[1] "UTF-8"
chr "á»\u008f"
[1] c3 a1 c2 bb c2 8f

(3) Converting (2) explicitly to latin1
[1] "á»"
[1] "latin1"
chr "á»"
[1] e1 bb 8f

(4) Setting encoding of (1) to "unknown"
[1] "á»"
[1] "unknown"
chr "á»"
[1] e1 bb 8f

在原始示例中, iconv()使用默认 from = ""参数表示从当前语言环境转换,实际上是“latin1”。因为 str的编码实际上是“UTF-8”,字符串的字节表示在步骤(2)中被扭曲,但随后被 cat() 隐式还原当它(大概)将字符串转换回当前语言环境时,如步骤 (3) 中的等效转换所示。

关于r - 如何在 R Windows 中将 Unicode 字符串写入文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38237358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com