我有下一个方法调用:
Formatting.git_log_to_html(`git log --no-merges master --pretty=full #{interval}`)
interval
的值类似于release-20130325-01..release-20130327-04
。
git_log_to_html
ruby方法是下一个(我只粘贴引起错误的行):
module Formatting
def self.git_log_to_html(git_log)
...
git_log.gsub(/^commit /, "COMMIT_STARTcommit").split("COMMIT_STARTcommit").each do |commit|
...
end
end
这过去是有效的,但实际上我检查了gsub引发了"UTF-8中无效的字节序列"错误。
你能帮我理解为什么和如何解决它吗?:/
git_log
的输出:
由于某些原因,这个命令:
git log --no-merges master --pretty=full #{interval}
给出的结果不是用UTF-8编码的,可能是您的计算机正在使用不同的字符集,请尝试以下操作:
module Formatting
def self.git_log_to_html(git_log)
...
git_log.force_encoding("utf8").gsub(/^commit /, "COMMIT_STARTcommit").split("COMMIT_STARTcommit").each do |commit|
...
end
end
我不确定这是否有效,但你可以试试。
如果这不起作用,您可以检查ruby iconv以检测字符集并将其编码为utf-8: http://www.ruby-doc.org/stdlib-2.0/libdoc/iconv/rdoc/
根据你在注释中添加的文件,我做了:
require 'open-uri'
content = open('https://dl.dropbox.com/u/42306424/output.txt').read
content.gsub(/^commit /, "COMMIT_STARTcommit").split("COMMIT_STARTcommit")
并且工作得很好,没有任何麻烦
顺便说一句,你可以试试:
require 'iconv'
module Formatting
def self.git_log_to_html(git_log)
...
git_log = Iconv.conv 'UTF-8', 'iso8859-1', git_log
git_log.gsub(/^commit /, "COMMIT_STARTcommit").split("COMMIT_STARTcommit").each do |commit|
...
end
end
,但在尝试转换为utf-8之前,您应该真正检测字符串的字符集