You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

读取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

火山引擎 最新活动