【问题标题】:Why is the encoding changing when I write to file?为什么写入文件时编码会发生变化?
【发布时间】:2021-01-25 23:15:41
【问题描述】:

我正在尝试为泰语制作大量 Anki 抽认卡,因此我使用 R 进行了一些网络抓取,以从网站(字典)中提取音译元素。在控制台中打印时一切看起来都很好,但是当我尝试将音译写入文本文件时,编码发生了变化,并且我失去了音标。使用Encoding() 显示大多数条目是“UTF-8”,这应该没问题,但有些条目被标记为“未知”。您可以从我的GitHub 下载 HTML 文件,下面是我的代码,用于导入和提取文本。

# Install appropriate library
install.packages("rvest")
library(rvest)

# Read in page to local variable
page <- read_html("Thai to English dictionary, translation and transliteration.html")

# Filter for specific tags
translit <- page %>% html_nodes(".tlit-line") %>% html_text()

write(translit, file = 'translit.txt')

【问题讨论】:

  • 您使用的是什么操作系统?不同的操作系统默认使用不同的编码 您的系统区域设置是什么?写出内容以验证编码后如何读取文件?
  • 我使用的是 Windows 10。RStudio 告诉我系统默认值为 ISO-8859-1。我使用 RStudio 的控制台在写入文件之前查看所有内容,但我使用记事本在写入后查看文件。
  • Windows 在写入文件等时默认使用 ISO-8859-1(又名“latin1”)编码。给定文件使用的编码通常不存储在文件本身中,因此如果不是latin1,则需要在读写时指定它。
  • 仍然没有骰子。在读取时指定编码没有任何效果。使用上面我使用的write() 函数,没有encoding 参数。如果我尝试在导入时使用“latin1”,则文本不可读。当我将 HTML 文件读取为“UTF-8”或“UTF-16”时,它在控制台中正确显示,但仍无法正确写入。
  • write() 没有编码选项,但您可以在连接上设置一个。 write(translit, file("translit.txt", encoding="utf8")); readLines(file("translit.txt", encoding="utf8")) 呢?

标签: r encoding


【解决方案1】:
library(stringi)
stringi::stri_write_lines(translit, encoding = "UTF-8", "translit.txt")

stri_write_lines (From stringi v1.5.3 by Marek Gagolewski)

将文本行写入文本文件。
写入文本文件是这样的 给定字符向量的每个元素都成为单独的文本 行。

用法

stri_write_lines(
  str,
  con,
  encoding = "UTF-8",
  sep = ifelse(.Platform$OS.type == "windows", "\r\n", "\n"),
  fname = con
)

参数

str - 带有要写入数据的字符向量

con - 输出文件或连接对象的名称(在 二进制模式)

encoding - 输出编码,NULL 或 '' 代表当前默认值

sep - 换行分隔符

fname - con 的弃用别名

详情

它是 R writeLines 函数的替代品,具有以下功能 轻松重新编码输出。

我们建议对所有文本文件使用 UTF-8 编码:因此,它是 输出的默认值。

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 2014-04-17
    • 1970-01-01
    • 2013-07-30
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2022-11-26
    相关资源
    最近更新 更多