来自CSV文件的字符串开头的神秘前导"空"字符

hol*_*lay 3 ruby csv byte-order-mark zero-width-space

在将CSV文件读入数组的过程中,我注意到第一个数组元素,它是一个字符串,包含一个前导"".

例如:

str = contacts[0][0]
p str
Run Code Online (Sandbox Code Playgroud)

给我...

"SalesRepName"

然后我偶然尝试尝试:

str = contacts[0][0].split(//)
p str
Run Code Online (Sandbox Code Playgroud)

那给了我......

["","S","a","l","e","s","R","e","p","N","a","m"," E"]

我已经检查了数组中的每个其他元素,这是唯一一个包含前导""的字符串.

hol*_*lay 7

现在,在我发布这个问题之前,我偶然发现了答案.显然,我写这个问题的行为让我想到了确定这个""字符的ascii数.

str = contacts[0][0].split(//)
p str[0].codepoints
Run Code Online (Sandbox Code Playgroud)

给我

[65279]

在询问ascii字符65279我发现这篇文章:https://stackoverflow.com/a/6784805/3170942

据SLaks说:

这是一个零宽度的不间断空间.它更常用作字节顺序标记(BOM).

反过来,这使我得到了解决方案:https: //stackoverflow.com/a/7780559/3170942
在这个回复中,knut提供了一个优雅的解决方案,如下所示:

File.open('file.txt', "r:bom|utf-8"){|file|
  text_without_bom = file.read
}
Run Code Online (Sandbox Code Playgroud)

随着,"r:bom | utf-8"是我一直在寻找的关键因素.所以我将它改编为我的代码,它变为:

CSV.foreach($csv_path + $csv_file, "r:bom|utf-8") do |row|
  contacts << row
end
Run Code Online (Sandbox Code Playgroud)

我在这个愚蠢的问题上花了好几个小时.希望这会节省你一些时间!