与Mojolicious或HTML :: Entities一起使用的关于Umlaut的Git :: Repository的问题

时间:2013-04-26 15:11:06

标签: perl mojolicious

我在网站上显示关于变音符号的git中的日志条目时遇到问题。我不知道在哪里寻找解决方案,所以我在这里寻求帮助。我认为它可能是编码问题,但use utf8在我的尝试中没有任何影响。我努力解释这个问题,希望找到一个有用的答案。非常感谢。

所以我在提交消息中创建了一个带有变音符号的repo:

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";

给出了与上面shell示例相同的输出。

当我使用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::EntitiesMojolicious具有相同的问题:

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

问题出在Git::Repository,或者我在哪里失败? 我在Ubuntu 12.04上使用Perl 5.16进行此测试。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

我发现了怎么做,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