2012-02-26 16 views
9

Chỉ cần để ghi lại - câu hỏi đầu tiên của tôi ở đây nhưng hy vọng không phải đầu vào cuối cùng của tôi trong cộng đồng. Nhưng đó không phải là lý do tôi ở đây.Làm việc với GD (imagettftext()) và UTF-8 ký tự

Tôi hiện đang phát triển một hệ thống đơn giản để tạo hình ảnh có văn bản trên đó. Everthing diễn ra tốt đẹp cho đến khi tôi nhận ra rằng GD không thể xử lý UTF-8 ký tự như

A, C, Z, A, O, é

và vân vân.

Để xóa mọi thứ lên - Tôi đang sử dụng imagettftext()

Đang cố gắng để giải quyết vấn đề của tôi, tôi đào vào sâu của google và một số giải pháp đã được trả lời, không ai trong số họ, thật đáng buồn, giải quyết vấn đề của tôi hoàn toàn. Hiện nay tôi đang sử dụng kịch bản này tôi tìm thấy trong chủ đề này - 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; 

} 

và nó hoạt động tốt đối với một số nhân vật nhưng không phải tất cả trong số họ, ví dụ, một với âm sắc không được chuyển đổi một cách chính xác.

Vì vậy, tại thời điểm này tôi không chắc chắn nơi và những gì để tìm kiếm nữa vì tôi không thể dự đoán đầu vào của người dùng. Để chính xác hơn, hệ thống sẽ lấy tên nghệ sĩ từ nguồn cấp dữ liệu xml và sử dụng dữ liệu để tạo hình ảnh (tôi không có kế hoạch hỗ trợ chữ tượng hình).

Tôi đã đảm bảo rằng dữ liệu được thu thập từ nguồn cấp dữ liệu thực sự là UTF-8 bằng cách sử dụng mb_detect_encoding() của PHP và tôi đã đảm bảo rằng tất cả các ký tự hiện không được hiển thị chính xác được thêm vào tệp phông chữ tôi ' m cho hàm imagettftext() bằng cách kiểm tra bằng công cụ charmap.

Hy vọng rằng tôi có thể tìm thấy câu trả lời của tôi ở đây và cảm ơn sự giúp đỡ của bạn trước!

chỉnh sửa

Để làm rõ - các nhân vật không được hiển thị một cách chính xác, hoặc, chính xác hơn, được thay thế bằng các nhân vật bị thay đổi. Đây là một ảnh chụp màn hình -

Malformed Characters

nó nên đọc "José González"

chỉnh sửa số 2

Sử dụng BIN2HEX() chức năng trên dữ liệu lấy từ lợi nhuận feed xml này.

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

chỉnh sửa - cố định

Như tôi đã tiếp tục nghiên cứu của tôi, tôi đã đưa ra một câu trả lời cho vấn đề của tôi, đoạn mã này làm được rồi!

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

Bây giờ tất cả các ký tự gặp rắc rối tôi đều được hiển thị chính xác!

+0

Điều gì không hoạt động chính xác? Làm thế nào là đầu ra không phải là những gì bạn mong đợi? Bạn đang sử dụng phông chữ có chứa các ký tự bạn muốn? Tôi đang sử dụng 'imagegettftext' với tiếng Nhật, vì vậy ký tự Unicode không phải là vấn đề chung. – deceze

+0

Có, như tôi đã nói trong bài đăng gốc _Tôi đã đảm bảo rằng tất cả các ký tự hiện không được hiển thị chính xác được ghi trong tệp font_. Điều đó làm việc là đầu ra - các ký tự không được hiển thị chính xác, hoặc, để chính xác hơn, được thay thế bằng các ký tự không đúng định dạng. Đây là một ảnh chụp màn hình - http://imgur.com/B8RHa - nó nên đọc "José González" – Pankucins

+1

Lỗi bạn nhận được ở đó: http://i.imgur.com/B8RHa.jpg chắc chắn là một vấn đề mã hóa, như in ấn một số UTF-8 caracters trong ANSI. – darma

Trả lời

4

Khi tiếp tục nghiên cứu, tôi đã đưa ra câu trả lời cho vấn đề của mình, đoạn mã này đã làm được!

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); 
} 

Bây giờ, tất cả các ký tự (và tất cả những ký tự mới tôi thấy) gặp rắc rối được hiển thị chính xác!

+1

Gọi lại «preg_replace' đặc biệt này có vẻ khá vô nghĩa. Chắc chắn điều này đang làm việc? – deceze

+0

Tôi có cùng một vấn đề. Cách khắc phục sự cố thực sự? Mã của bạn sẽ không trả lại văn bản có dấu. http://stackoverflow.com/questions/23551989/how-to-correctly-show-accents-or-special-characters-n-in-php-gd – ephramd

0

Ở vị trí đầu tiên, hãy đảm bảo rằng IDE của bạn không lưu tệp ở một mã hóa khác với UTF8. Ví dụ, Intellij IDEA 9 thay đổi UTF-8 thành WINDOWS-1250 trên nền tảng Windows. Nếu bạn sẽ không nhận thấy điều đó và bạn sẽ sử dụng các chuỗi liên tục để thử nghiệm, nó là khá điên để gỡ lỗi.

Các vấn đề liên quan