今天想在项目中应用Cucumber进行测试,感觉不错,可惜在命令行窗口中输出的结果中文全变成了乱码,完全影响测试结果的可读性(Cucumber的强项就在此啊)。于是开始寻找解决的方法。 1、最先想到的是cucumber输出的是UTF-8编码,而且整个Rails站点的环境也都是UTF-8了,输出到DOS命令行,显然会出现中文乱码。 于是Google到http://www.iteye.com/topic/120172,里面提出的解决方法是使用 chcp 65001修改cmd的内码页为Unicode。直接输入unicode没问题了,可惜这种方式执行ruby代码会出现Bad file descripto错误!其原因大致是出在ruby端了。 无奈只能另寻他路。 2、换一种思路,考虑到ruby的动态特性,想到覆盖Kernel中的print和puts方法,将输出的内容转换为GB2312,再输出岂不解决问题? 于是翻阅cucumber的代码,发现此为正解,而且cucumber已经考虑到这种情况,有文件cucumber-0.1.16\lib\cucumber\formatters\unicode.rb为证。 可惜很遗憾,cucumber中考虑到需要转换的内码从1251到1252(WinLatin1),没有考虑到中文windows中内码代码为936,因此转换UTF-8输出内容的功能没有启用。另外是不是把936加上就解决问题了呢?测试过好像不行,原因就没深究了。 codepages = (1251..1252) if codepages.include?(codepage) Cucumber::CODEPAGE = “cp#{codepage}“ .. 最终的解决方法是讲unicode.rb修改至如下: # Require this file if you need Unicode support. require ‘cucumber/platform’ require ‘cucumber/formatters/ansicolor’ $KCODE=’u’ unless Cucumber::RUBY_1_9 #if Cucumber::WINDOWS_MRI && `chcp` =~ /Active code page: (\d+)/ #codepage = $1.to_i #codepages = (1251..1252) #if codepages.include?(codepage) Cucumber::CODEPAGE = “GB2312″ #强制将输出内码为GB2312 require ‘iconv’ module Kernel alias cucumber_print print def print(*a) begin cucumber_print *Iconv.iconv(Cucumber::CODEPAGE, “UTF-8″, *a) rescue Iconv::IllegalSequence cucumber_print(*a) end end alias cucumber_puts puts def puts(*a) begin cucumber_puts *Iconv.iconv(Cucumber::CODEPAGE, “UTF-8″, *a) rescue Iconv::IllegalSequence cucumber_puts(*a) end end end #end #end
解决Cucumber测试结果中文乱码问题
最新推荐文章于 2024-03-13 11:21:26 发布