3

我有下一个方法调用:

Formatting.git_log_to_html(`git log --no-merges master --pretty=full #{interval}`)

的值interval类似于release-20130325-01..release-20130327-04

ruby 方法是下git_log_to_html一个(我只粘贴引发错误的行):

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

https://dl.dropbox.com/u/42306424/output.txt

4

1 回答 1

3

出于某种原因,此命令:

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 之前,您应该真正检测到字符串的字符集。

于 2013-03-31T10:03:25.117 回答