读取plainprogram.txt分割行时遇Split invalid byte sequence in US-ASCII错误
解决Ruby读取文件时的"Split invalid byte sequence in US-ASCII"错误
嘿,我来帮你搞定这个编码错误问题!
问题出在哪?
你遇到的这个报错,根源是你要读取的plainprogram.txt里藏了个非US-ASCII字符——就是代码行40 let x = x – 1里的那个长减号(不是我们平时用的普通短横-)。Ruby默认用US-ASCII编码去加载文件,这个编码解析不了这个特殊符号,所以执行split()的时候就触发了错误。
几种解决办法
1. 读取文件时指定编码(最推荐)
直接在读取文件的时候告诉Ruby用UTF-8编码(现在绝大多数文件都是这个编码),修改你的代码就行:
# 用readlines指定编码 File.readlines("plainprogram.txt", encoding: "UTF-8").each do |line| pieces = line.split() # 这里可以加你要处理pieces的逻辑,比如打印看看结果 p pieces end # 或者用foreach,内存占用更低(适合大文件) File.foreach("plainprogram.txt", encoding: "UTF-8") do |line| pieces = line.split p pieces end
2. 手动修改文件里的特殊字符
如果不想改代码,也可以直接编辑plainprogram.txt,把那个长减号–替换成普通的短横-,这样整个文件就都是US-ASCII字符了,原来的代码就能正常跑。
3. 设置Ruby全局默认编码
要是你经常遇到这类编码问题,可以在代码开头加上两行,让Ruby默认用UTF-8处理所有文件读写:
Encoding.default_external = "UTF-8" Encoding.default_internal = "UTF-8" # 然后再执行你的读取逻辑 File.readlines("plainprogram.txt").each do |line| pieces = line.split() end
验证效果
改完之后,原来报错的那行代码会被正确分割成数组,比如保留长减号的话,结果是["40", "let", "x", "=", "x", "–", "1"],替换成短横后就是["40", "let", "x", "=", "x", "-", "1"],完美解决问题~
内容的提问来源于stack exchange,提问作者nick n




