加载具有 UTF-8 编码错误 "no lines available in input" 的 .csv 文件 - 字节顺序标记 (BOM)“ï..”
Loading .csv file with UTF-8 encoding error "no lines available in input" - byte order mark (BOM) "ï.."
我正在使用 read.csv2()
函数加载 CSV 文件。该文件包含 non-ASCII 个字符,例如“é”。
在 Excel 中加载它时,它们使用 UTF-8 编码正确显示,所以我猜我在使用 read.csv2()
.
加载此文件时需要使用相同的编码
但一切都出了问题...
# works but non-ASCII characters do not display correctly
read.csv2(file = "./data/myfile.csv")
read.csv2(file = "./data/myfile.csv", fileEncoding = "latin1")
# does not work: error "no lines available in input"
read.csv2(file = "./data/myfile.csv", fileEncoding = "UTF-8")
我尝试使用 read.delim()
和 read.table()
但没有成功;我得到了同样的错误。请注意 headers
、sep
和 quotes
似乎没问题,因为 table 在使用 read.csv2(file = "./data/myfile.csv")
时正确显示(non-ASCII 字符除外...... ).
我不知道如何使其可重现...如果您有任何提示,请不要犹豫发表评论!
编辑
当我查看第一列的第一个 header 时,它在列名前面显示了一个奇怪的 ï..
。但是当我在Excel中打开它时,这一行header...
前面没有任何东西(甚至没有space)
您遇到了常见的 BOM 问题。 BOM 通常用于指示 generic UTF-16 和 UTF-32(字节顺序相关)的字节顺序。
显然 Microsoft 认为改变现有标准的解释是可行的方法(谁关心与非 Microsoft 系统的互操作性?),因此他们使用 BOM 作为文件是 UTF-8 的指示,以区别于其他DOS 和 Windows 使用的遗留编码。 (注意:Linux 并且 Apple 将默认编码更改为 UTF-8,无需破坏内容或添加 BOM,而且速度更快)。
因此,Microsoft 创建的 UTF-8 文件通常具有 BOM (0xEF 0xBB 0xBF),在 cp1252(Microsoft 对 Latin-1 的扩展)上显示为 
。
但是大多数工具(不是微软出品的)都误解了BOM,有时遵循标准,所以将其解释为隐藏的白色space(大多数现代Unicode标准中转换为BOM的代码点的本义) ,或者只是将其视为二进制数据,因此忽略数据。
出于这个原因,现在我们有了编码 utf-8-bom
,它只是跳过初始 BOM(或在写入时创建 BOM)。这通常可以解决问题。
我正在使用 read.csv2()
函数加载 CSV 文件。该文件包含 non-ASCII 个字符,例如“é”。
在 Excel 中加载它时,它们使用 UTF-8 编码正确显示,所以我猜我在使用 read.csv2()
.
但一切都出了问题...
# works but non-ASCII characters do not display correctly
read.csv2(file = "./data/myfile.csv")
read.csv2(file = "./data/myfile.csv", fileEncoding = "latin1")
# does not work: error "no lines available in input"
read.csv2(file = "./data/myfile.csv", fileEncoding = "UTF-8")
我尝试使用 read.delim()
和 read.table()
但没有成功;我得到了同样的错误。请注意 headers
、sep
和 quotes
似乎没问题,因为 table 在使用 read.csv2(file = "./data/myfile.csv")
时正确显示(non-ASCII 字符除外...... ).
我不知道如何使其可重现...如果您有任何提示,请不要犹豫发表评论!
编辑
当我查看第一列的第一个 header 时,它在列名前面显示了一个奇怪的 ï..
。但是当我在Excel中打开它时,这一行header...
您遇到了常见的 BOM 问题。 BOM 通常用于指示 generic UTF-16 和 UTF-32(字节顺序相关)的字节顺序。
显然 Microsoft 认为改变现有标准的解释是可行的方法(谁关心与非 Microsoft 系统的互操作性?),因此他们使用 BOM 作为文件是 UTF-8 的指示,以区别于其他DOS 和 Windows 使用的遗留编码。 (注意:Linux 并且 Apple 将默认编码更改为 UTF-8,无需破坏内容或添加 BOM,而且速度更快)。
因此,Microsoft 创建的 UTF-8 文件通常具有 BOM (0xEF 0xBB 0xBF),在 cp1252(Microsoft 对 Latin-1 的扩展)上显示为 
。
但是大多数工具(不是微软出品的)都误解了BOM,有时遵循标准,所以将其解释为隐藏的白色space(大多数现代Unicode标准中转换为BOM的代码点的本义) ,或者只是将其视为二进制数据,因此忽略数据。
出于这个原因,现在我们有了编码 utf-8-bom
,它只是跳过初始 BOM(或在写入时创建 BOM)。这通常可以解决问题。