使用 BOM 读取 UTF-8 文本文件

Posted

技术标签:

【中文标题】使用 BOM 读取 UTF-8 文本文件【英文标题】:Read a UTF-8 text file with BOM 【发布时间】:2014-03-04 16:34:27 【问题描述】:

我有一个开头带有字节顺序标记 (U+FEFF) 的文本文件。我正在尝试在 R 中读取文件。是否可以避免字节顺序标记?

函数fread(来自data.table包)读取文件,但在第一个变量名的开头添加ļ»æ

> names(frame_pers)[1]
[1] "ļ»æreg_date"

read.csv 函数也是如此。

目前我已经制作了一个从第一列名称中删除 BOM 的函数,但我相信应该有一种方法可以自动剥离 BOM。

remove.BOM <- function(x) setnames(x, 1, substring(names(x)[1], 4))

> names(frame_pers)[1]
[1] "ļ»æreg_date"
> remove.BOM(frame_pers)
> names(frame_pers)[1]
[1] "reg_date"

我正在为 R 会话使用本机编码:

> options("encoding" = "")
> options("encoding")
$encoding
[1] ""

【问题讨论】:

【参考方案1】:

你试过read.csv(..., fileEncoding = "UTF-8-BOM")吗? ?file 说:

从 R 3.0.0 开始,编码“UTF-8-BOM”被接受并将删除 字节顺序标记(如果存在)(通常用于文件和网页 由 Microsoft 应用程序生成)。

【讨论】:

也不适合我。当从记事本++复制粘贴时,我的原始数据看起来像“31.1”,但在带有 fread 的 R 中它分成 2 列,并且使用 read.csv 我得到以下前缀“”(使用 as.is = TRUE)。我使用 autohotkey 和 convert2txt 从 gui 显示中获取 ocr,并将其写入文件。这给了我“31.2”变成“.331”的问题【参考方案2】:

这是在版本 1.9.6 和 1.9.8 之间使用this commit 处理的;更新您的 data.table 安装以解决此问题。

完成后,您可以使用fread

fread("file_name.csv")

【讨论】:

我使用的是 1.10.4。我最终使用“read_csv”并设置“col_types = “c””,然后在转换为数字之前修剪第一个字符。这是一个杂牌。

以上是关于使用 BOM 读取 UTF-8 文本文件的主要内容,如果未能解决你的问题,请参考以下文章

python 读取文本里有多种编码

怎么辨别文本文档的编码?

linux给一个文件头部添加内容,给UTF-8添加BOM头

将 BOM 添加到 UTF-8 文件

使用 Perl 从字符串中删除 BOM

关于Encode in UTF-8 without BOM