关于ruby的文件/目录名编码错误问题

我有一个ruby的脚本,放在英文名的目录下执行是正常的,但如果放在中文名的目录下执行就会报错,研究来研究去都没找到解决方法,本来打算放弃了,就只在英文名的目录下执行算了,后来想想还是研究下解决方法吧,不然以后还会遇到这样的问题的。

先说个题外话,很诡异的问题,就是原先在别的电脑上执行是没问题的,就是在现在这电脑上执行才有问题的,真是百思不得其解啊。

接下来说一下我的解决过程吧,首先打开ruby的trace,就是在执行ruby的时候加上-d这个参数啦,这是打开debug的选项。

不过我要运行的是人家写好的脚本,我要加的是–trace而不是-d。

然后再执行一次ruby脚本,在报错的同时也会显示脚本的执行过程,包括现在执行到哪个脚本、在哪个函数、哪一行,然后可以通过这个方法定位错误,再根据错误信息来解决就行啦,这是解决编程错误问题的通用方法哦。

我的脚本在执行的时候,先报的错误是:incompatible character encodings: GBK and UTF-8 (Encoding::CompatibilityError)。这很明显就是一个编码错误的问题,估计是脚本在获取文件路径后,路径的编码与后续的路径处理时所用的编码不一样造成的。然后我就定位到这一处,给该路径的变量加上.encode(‘gbk’),如path.encode(‘gbk’),这样把编码强制转换一下。

保存后再执行脚本,上面的错误已经没报了,说明那个问题解决了,不过又报了另外一个错误:incompatible encoding regexp match (GBK regexp with ASCII-8BIT string) (Encoding::CompatibilityError)。这肯定还是编码错误问题呗,方法还是一样,定位到该处,同样给变量加上编码转换的代码,我这里用的是.force_encoding(“BINARY”)。

保存后再执行脚本,问题终于解决了,已经顺利执行。

不过需要注意的是,我这里的解决也还是临时的,还不知道是否会有副作用,也不知道是否还会有其他类型的错误。另外就是,我所用的两个转换编码的方法,为什么要这么用,我也说不清楚,只是凭经验及感觉判断的而已。

此条目发表在原创空间分类目录。将固定链接加入收藏夹。

发表评论