2012-02-26 7 views
9

기록을 위해 - 여기 저의 첫 번째 질문이지만 커뮤니티에서 마지막으로 입력 한 내용은 아닙니다. 하지만 그게 내가 여기있는 이유가 아니야.GD (imagettftext()) 및 UTF-8 문자로 작업하기

현재 텍스트가있는 이미지를 생성해야하는 간단한 시스템을 개발 중입니다. 내가 GD 등등

전자,

A, C, Z, ä, ø 같은 UTF-8 문자를 처리 할 수없는 것을 깨달았 때까지 모든게 잘 갔다.

이 일을 지우려면 - 나는 구글의 깊이로 파고 내 문제를 해결하기 위해 노력 imagettftext()

사용하고 일부 솔루션은 반환 된, 그들 중 누구도, 슬프게도, 완전히 내 문제를 해결하지 않습니다. 현재 내가이 스레드에있는이 스크립트를 사용하고 있습니다 - PHP function imagettftext() and unicode

private function properText($text){ 

    // Convert UTF-8 string to HTML entities 
    $text = mb_convert_encoding($text, 'HTML-ENTITIES',"UTF-8"); 
    // Convert HTML entities into ISO-8859-1 
    $text = html_entity_decode($text,ENT_NOQUOTES, "ISO-8859-1"); 
    // Convert characters > 127 into their hexidecimal equivalents 
    $out = ""; 
    for($i = 0; $i < strlen($text); $i++) { 
     $letter = $text[$i]; 
     $num = ord($letter); 
     if($num>127) { 
      $out .= "&#$num;"; 
     } else { 
      $out .= $letter; 
     } 
    } 

    return $out; 

} 

을하고 일부 문자는 아니지만 그들 모두 잘 동작, 예를 들어, 움라우트와 올바르게 변환되지 않습니다.

그래서 사용자 입력을 예측할 수 없으므로 어디서 무엇을 더 볼지 모릅니다. 더 정확하게 말하면, 시스템은 XML 피드에서 아티스트 이름을 가져오고 이미지 생성을 위해 데이터를 사용합니다 (저는 상형 문자를 지원할 계획이 아닙니다).

PHP의 mb_detect_encoding()을 사용하여 피드에서 수집 한 데이터가 실제로 UTF-8인지 확인했으며, 현재 올바르게 표시되지 않은 모든 문자가 글꼴 파일에 삽입되어 있는지 확인했습니다. 0 imagettftext() 기능을 Windows charmap 도구로 확인하여 기능에 공급합니다.

잘하면 내 대답을 찾을 수 있으며 미리 도움을 주셔서 감사합니다!

명확히하려면 편집 - 문자가 더 정확히 말하면, 제대로 표시되지 않았거나이 잘못된 문자로 대체됩니다. 이 BIN2HEX 사용 "호세 곤잘레스"

편집 아니오 2

() XML 피드 반환이에서 검색된 데이터에 기능을 읽어야

Malformed Characters

- 여기 스크린 샷입니다.

José González -> 4a6f73c3a920476f6e7ac3a16c657a 
// input -> bin2hex(input) 

편집 - 나는 내 문제에 대한 답변을 내놓았다 내 연구를 계속 따라

고정은,이 코드 조각은 그것을했다!

$text = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8"); 
$text = preg_replace('~^(&([a-zA-Z0-9]);)~',htmlentities('${1}'),$text); 
return($text); 

이제 모든 문제가있는 문자가 올바르게 표시됩니다.

+0

정확히 작동하지 않는 것은 무엇입니까? 출력이 예상 한 것과 어떻게 다른가요? 원하는 문자가 실제로 들어있는 글꼴을 사용하고 있습니까? 일본어로'imagegettftext'를 사용하기 때문에 유니 코드 문자는 일반적으로 문제가되지 않습니다. – deceze

+0

예, 원래 게시물에서 말했듯이 _ 저는 현재 올바르게 표시되지 않은 모든 문자가 글꼴 _ 파일에 삽입되어 있는지 확인했습니다. 출력이 작동한다는 것 - 문자가 올바르게 표시되지 않거나, 더 정확하게 말하면 잘못된 문자로 바뀝니다. 다음은 스크린 샷입니다 - http://imgur.com/B8RHa - "José González"를 읽어야합니다 – Pankucins

+1

오류 : http://i.imgur.com/B8RHa.jpg는 인쇄와 같이 인코딩 문제입니다. ANSI의 일부 UTF-8 캐릭터. – darma

답변

4

내 연구를 계속하면서 나는 내 문제에 대한 대답을 생각해 냈다.

private function properText($text){ 
    $text = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8"); 
    $text = preg_replace('~^(&([a-zA-Z0-9]);)~',htmlentities('${1}'),$text); 
    return($text); 
} 

이제 모든 문제가있는 모든 문자 (그리고 내가 본 모든 새로운 문자)가 올바르게 표시됩니다.

+1

이 특별한'preg_replace' 콜백은 꽤 무의미한 것처럼 보입니다. 물론이게 효과가 있니? – deceze

+0

동일한 문제가 있습니다. 정말 고정 되었습니까? 코드가 액센트가있는 텍스트를 반환하지 않습니다. http://stackoverflow.com/questions/23551989/how-to-correctly-show-accents-or-special-characters-n-in-php-gd – ephramd

0

먼저 IDE가 UTF8이 아닌 다른 인코딩으로 파일을 저장하지 않는지 확인하십시오. 예를 들어 새로운 Intellij IDEA 9는 Windows 플랫폼에서 UTF-8을 WINDOWS-1250으로 변경했습니다. 그것을 알아 채지 못할 것이며 테스트를 위해 상수 문자열을 사용하게되면 디버깅하는 것이 매우 어렵습니다.