2013-03-31 3 views
2

У меня есть следующий вызов метода:GSUB поднимает «недопустимую последовательность байтов в кодировке UTF-8»

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

Значение interval является чем-то вроде release-20130325-01..release-20130327-04.

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

+0

Всякий раз, когда я вижу это сообщение, я добавляю строку '#encoding: utf-8' в начало файла, и это исправлено для меня. – bdares

ответ

2

По некоторым причинам, эта команда:

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 

Я не уверен, что это сработает, но вы можете попробовать.

Если это не работает, вы можете проверить рубиновый 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.

+0

Я попробую с ruby ​​iconv (принудительное кодирование не сработало), но если это поможет, вот вывод 'git log --no-merges master --pretty = full # {interval}': https: // dl.dropbox.com/u/42306424/output.txt Я не вижу символы не-utf8 :( – Draco

+0

На самом деле есть символы не-utf8. Файл кодируется ISO-8859-1. Например, '' не будет действительным utf-8 в этом файле –

+1

ISO-8859-1 поддерживается в UTF-8, проблема в том, что вы используете кодировку, которая не может быть легко преобразована в UTF-8, то есть: UTF-16. – rorra

 Смежные вопросы

  • Нет связанных вопросов^_^