Проблемы с Git::Repository, связанные с использованием Umlaut с Mojolicious или HTML::Entities

У меня возникла проблема при отображении записей журнала из git на веб-сайте, касающемся умляутов. У меня нет идеи, где искать решения, поэтому я прошу помощи здесь. Я действительно думаю, что это может быть проблема с кодировкой, но use utf8 не повлияло на мои попытки. Я приложил некоторые усилия, чтобы объяснить проблему в надежде найти полезный ответ. Большое спасибо.

Итак, я создаю репо с умлаутами в сообщении коммита:

echo "Hello Wörld!" > a_file.txt
git init
git add a_file.txt
git commit -m "Some Ümlaut: üöä"

Теперь я могу посмотреть это в cmd, проблем не возникает:

$ git log
  ...
    Some Ümlaut: üöä

Я также могу распечатать этот материал на Perl без проблем. Я позвоню:

use Git::Repository;
my $repo = Git::Repository->new(work_tree => ".");
my $log  = $repo->run( "log" );
print "$log\n";

который дает мне тот же результат, что и пример оболочки выше.

Проблема возникает, когда я использую Mojolicious. Вот пример:

use Mojolicious::Lite;

get '/' => sub {
  my $self = shift;

  use Git::Repository;
  my $repo = Git::Repository->new(work_tree => ".");
  my $log  = $repo->run( "log" );
  $self->render(text => "$log  -- möre Ümläut\n" );
};

app->start;

Когда я запускаю это, умлаут в строке будет работать, но не те, которые приходят из сообщения коммита. Чтобы показать это, я могу запустить приведенный выше Perl следующим образом:

perl mojo.pl daemon

Затем я вызываю веб-сайт с помощью curl:

$ curl http://127.0.0.1:3000
...
    Some Ãmlaut: üöä  -- möre Ümläut

Как я уже сказал: умлауты из Git терпят неудачу, остальное в порядке.

Поэтому я подумал, что был умным и перевел их в объекты HTML:

use strict;
use warnings;
use Git::Repository;
use HTML::Entities 'encode_entities';

my $repo = Git::Repository->new(work_tree => ".");
my $log = $repo->run( "log" );
print "$log\n";

my $htmlified = encode_entities($log);
print "$htmlified\n";

Но, назвав это, хорош только первый вывод. У HTML::Entities та же проблема, что и у Mojolicious:

...
Some Ümlaut: üöä
...
Some Ümlaut: üöä

Дело в том, что проблема в Git::Repository, или где я терплю неудачу? Для этих тестов я использовал Perl 5.16 на Ubuntu 12.04. Спасибо за любую помощь.


person Boris Däppen    schedule 26.04.2013    source источник


Ответы (1)


Я узнал, как это сделать, decode_utf8() твой друг. Но я до сих пор не уверен, зачем нужен этот шаг...

Вот как это происходит:

use Mojolicious::Lite;

# we need this lib, part of core
use Encode;

get '/' => sub {
  my $self = shift;

  use Git::Repository;
  my $repo = Git::Repository->new(work_tree => ".");
  my $log  = $repo->run( "log" );

  # this call does the trick
  my $wtf  = decode_utf8($log);

  $self->render(text => "$wtf  -- möre Ümläut\n" );
};

app->start;

Надеюсь, это поможет и другим людям. Если кто-то считает, что должен быть отчет об ошибке для одной из упомянутых библиотек, пожалуйста, сообщите здесь. Я понятия не имею, если это обходной путь, ошибка или функция :-P

person Boris Däppen    schedule 27.04.2013
comment
Это также работает с примером с использованием HTML::Entities, опубликованным выше. Печать в стандартный вывод больше не работает (Some �mlaut: ��), но HTML-сущности работают нормально: Some Ümlaut: üöä - person Boris Däppen; 27.04.2013
comment
Причина в том, что, скорее всего, Mojolicious тщательно кодирует перед рендерингом; поэтому важно декодировать входные данные, поступающие из внешних источников. Ключевым преимуществом Unicode является то, что вы декодируете и кодируете границы вашей программы. - person Joel Berger; 30.04.2013
comment
Афаик: проблема в том, что Git::Repository возвращает не Perl-Chars, а байты как есть. - person Boris Däppen; 30.04.2013
comment
Правильно, и поэтому вы должны расшифровать их. Юникод сложный, пошли по магазинам :-) - person Joel Berger; 30.04.2013