2010-12-20 4 views
5

템플릿 툴킷이 인코딩을 제대로 처리하지 않는 것처럼 보입니다.템플릿 툴킷 문자 인코딩

template->process 파일 이름 (템플릿을 가져올 곳), 해시 참조 (모든 매개 변수 포함) 및 스칼라 참조 (출력 위치)를 전달하면 반환하고 차례대로 표시합니다. 사용자.

움라우트가 포함 된 문자열을 제공하면 html 출력에는 모든 문자 대신 올바른 흰색 문자 수의 흰색 물음표가있는 검은 색 다이아몬드가 포함됩니다. 다른 캐릭터는 괜찮습니다.

template-> process를 호출하기 전에 경고를 사용하고 있습니다.이 시점에서 괜찮은 것 같습니다. template->process을 호출 할 때 쓰레기로 변환된다는 것을 알 수 있습니다.

아이디어가 있으십니까? ENCODING => "utf8"binmode => ":utf8"을 사용해 보았지만 둘 다 출력에 아무런 영향을주지 않습니다.

여기 내 코드는 템플릿 -> 프로세스에 대한 호출을 보여주기 위해 잘라낸 부분입니다. {binmode => 'utf8'}을 생략해도 아무 효과가 없습니다.

<put variables in hash referenced to by vars> 
<print out variables in has referenced to by $var> 
my $data; 
$template->process($self->filename, $vars, \$data, {binmode => ':utf8'}) || die "Template process failed: ", $template->error(); 
return $data; 

귀하의 답변을 안녕하세요 덕분 해결, 문제는 템플릿 프로세스가 일을했다고 밝혀졌다, 우리는 그 다음 우리는 또한 그래서를 출력하기 전에 임시 파일에 문자열을 썼다 내가 :)

+0

아마도 utf8 대신 UTF-8을 전달하면 무관합니다. 때로는 중요합니다. 예 : http://jeremy.zawodny.com/blog/archives/010546.html – Hugmeir

+2

UTF-8 텍스트가 엉망이되었거나 브라우저가 올바른 인코딩을 선택하지 않았습니까? –

+0

후자의 경우 어떻게 브라우저에 사용할 인코딩을 말할 수 있습니까? HTML 템플리트 pro (우리가 움직이는 시스템)를 사용하면 문자가 올바르게 표시됩니다. 이것은 내가 TT라고 믿게 만들었지 만 틀릴 수 있습니다. 기차에서 지금 내가 내일 어떤 제안이라도 시험해 볼 것일 정도로. – cjh

답변

6

아래 코드가 작동합니다. $data, 특히 포함 된 문자열은 Perl 문자열, 즉 적절하게 decode d 여야합니다. introduction to encoding in the official documentation을 참조하십시오.

use Template '2.21_02'; 

my $tt = Template->new({ 
    ENCODING  => 'utf8', 
    # other options … 
}); 

$tt->process(
    $template, $data, $output, {binmode => ':utf8'} 
) or die $tt->error . ' in ' . $template; 
+1

자이푸디키가 정확히 원래의 질문에서 시도했다고 말했습니까? –

+0

No.그는 작동하지 않는다고 말했고, 나는 그것이 작동한다고 단언했다. 나는 또한 퍼즐에 빠진 조각에 대해 썼다. – daxim

+0

내가 쓴 것이기는하지만, 이것 또한 내가 물어 본 질문에 대한 대답이다. 템플릿 툴킷이 인코딩을 잘 처리하고 있습니다. 모두에게 감사드립니다. – cjh

1

내 솔루션은 P이었다 시간 내 주셔서 모두에게 감사

<put variables in hash referenced to by vars> 
<print out variables in has referenced to by $var> 
my $data; 
binmode(STDOUT, ":utf8"); 
$template->process($self->filename, $vars, \$data, {binmode => ':utf8'}) || die "Template process failed: ", $template->error(); 
return $data; 

: 같은 파일을 bin 파일 모드를 설정하는 데 필요한 코드는 현재 보이는 unt 라틴 문자 이외의 모든 문자는 런타임시에 [% loc('string') %]을 통해 포함되도록 en.po에 저장됩니다. 어쨌든 템플릿은 현지화되어야하므로 잘 작동합니다.

+0

귀하의 회신을 보내 주셔서 감사합니다. 그러나 제 경우에는 이것이 사용자가 제공 한 데이터이며, 많은 템플릿이 있으므로 실제로는 옵션이 아닙니다. – cjh

+1

@suicideducky - 그런 다음 Template :: Plugin :: Decode를 시도하고'| 각 사용자 문자열 다음에 디코드합니다. –