2013-04-26 3 views
2

Umlaut와 관련된 웹 사이트에 git의 로그 항목을 표시하는 동안 문제가 있습니다. 솔루션을 찾을 곳이 어디인지 알지 못해 여기에서 도움을 요청합니다. 나는 이것이 인코딩 문제 일지 모르지만, use utf8은 내 시도에서 어떤 영향도 미치지 않았다. 도움이되는 답변을 찾기 위해 문제를 설명하기 위해 노력했습니다. 고마워.Mojolicious 또는 HTML :: Entities와 함께 사용중인 Umlaut에 관한 Git :: Repository 관련 문제

그래서 내가 커밋 메시지에 움라우트와의 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"; 

합니다.

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 mojo.pl daemon 

그때 컬과 웹 사이트를 호출

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

내가 말했듯이 : 망할 놈의 모음 변이에 실패, 나머지는 괜찮습니다.

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 엔티티로 변환 생각했다.

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

이 문제가 Git::Repository에 있는지, 그것은, 아니면 어디 실패 않습니다 HTML::EntitiesMojolicious과 같은 문제가? 필자는이 테스트를 위해 Ubuntu 12.04에서 Perl 5.16을 사용했습니다. 도움 주셔서 감사합니다.

답변

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; 

희망이뿐만 아니라 다른 사람을 도움이됩니다. 누군가가 언급 한 libs 중 하나에 대한 bugreport가 있어야한다고 생각한다면 여기에 알려주십시오. 나는 이것이 해결 방법, 버그 또는 기능인 경우 단서가 없습니다 : - P

+0

이것은 HTML :: Entities를 사용하는 예제에서도 작동합니다.stdout으로 인쇄하는 것이 더 이상 효과가 없지만 ('Some mlaut : '), HTML 엔티티는 잘 작동합니다 :'Some Ü mlaut : ü ö ä' –

+0

왜냐하면 Mojolicious는 표현; 따라서 외부 소스에서 온 입력을 디코딩하는 것이 중요합니다. 유니 코드의 주요 임차인은 프로그램의 경계에서 디코딩하고 인코딩하는 것입니다. –

+0

Afaik now : 문제는 Git :: Repository가 Perl-Chars가 아니라 "있는 그대로"의 바이트를 반환한다는 것입니다. –