2013-06-20 12 views
7

Mam następujący wiersz adresu: Praha 5, Staré Město,PHP UTF-8 Dekodowanie Issue

muszę korzystać utf8_decode funkcji() w tym ciągu, zanim można napisać go w pliku PDF (z użyciem domPDF lib).

Jednak funkcja dekodowania php utf8 dla powyższej linii adresowej wydaje się niepoprawna (lub raczej niekompletna).

Poniższy kod:

<?php echo utf8_decode('Praha 5, Staré Město,'); ?> 

Wytwarza to:

Praha 5, Staré STO M,

Każdy pomysł dlaczego Ě nie jest uzyskiwanie dekodowane?

+0

utf8_decode po prostu konwertuje ciąg zakodowany w UTF-8, czy Twój ciąg znaków jest utf8_encoded? –

Odpowiedz

14

utf8_decodekonwertuje ciąg znaków z kodowania UTF-8 do ISO-8859-1, a.k.a. "Latin-1".
Kodowanie Latin-1 nie może reprezentować litery "ě". To takie proste.
"Dekodowanie" jest całkowitym błędem, podobnie jak iconv('UTF-8', 'ISO-8859-1', $string).

Zobacz What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text.

+0

Dzięki najlepsza odpowiedź (2015) +1 – delive

+1

@deceze 'utf8_decode konwertuje ciąg znaków z kodowania UTF-8 do ISO-8859-1' Zaoszczędził mi prawdopodobnie kilka godzin!z przyjemnością kupiłbym ci drinka, gdybyś był w naszym biurze :) – whizzkid

+0

@whizzkid Uderz mnie następnym razem, gdy będziesz w Niemczech ...; o) – deceze

0

nie trzeba, że ​​(@Rajeev: Ten ciąg jest automatycznie wykrywane jako UTF-8:

echo mb_detect_encoding('Praha 5, Staré Město,'); 

zawsze powróci UTF-8.).

Wolisz patrz: https://code.google.com/p/dompdf/wiki/CPDFUnicode

+0

Usunąłem utf8_decode i ustaw , a także DOMPDF_UNICODE_ENABLED jest ustawione na true w config. Jednak nie działa, ě pojawia się jako? – Latheesan

+0

Używam czcionki "Helvetica", czy to możliwe? – Latheesan

+0

Być może trzeba będzie zainstalować inną czcionkę. Sprawdź odpowiedzi tutaj: http://stackoverflow.com/questions/990181/dompdf-problem-with-cyrillic-characters – scraaappy

0

I skończyłem przy użyciu UTF-8/UTF-16 funkcji dekodowania domowej uprawy (konwersja do & #NUMBER; reprezentacje), nie znalazłem żadnego wzorca dlaczego UTF-8 nie został wykryty, podejrzewam, że tak jest, ponieważ sekwencja "encoded-as" nie zawsze znajduje się dokładnie w tej samej pozycji w zwracanym ciągu. Możesz zrobić dodatkowe sprawdzenie tego.

Trójznakowy wskaźnik UTF-8: $ startutf8 = chr (0xEF) .chr (187) .chr (191); (jeśli widzisz to GDZIEKOLWIEK, nie tylko pierwsze trzy znaki, ciąg jest kodowany w UTF-8)

Dekodowanie zgodnie z regułami UTF-8; ten zastąpił starszą wersję, która chugged przez bajt po bajcie: using

function charset_decode_utf_8 ($string) { 
/* Only do the slow convert if there are 8-bit characters */ 
/* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */ 
if (! ereg("[\200-\237]", $string) and ! ereg("[\241-\377]", $string)) 
    return $string; 

// decode three byte unicode characters 
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",  
"'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'", 
$string); 

// decode two byte unicode characters 
$string = preg_replace("/([\300-\337])([\200-\277])/e", 
"'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'", 
$string); 

return $string; 
} 
0

problem jest w kodowaniu plików PHP, zapisz plik w kodowaniu UTF-8, to nawet nie trzeba używać utf8_decode, jeśli masz te dane 'Praha 5, Staré Město,' z baza danych, lepiej zmienić zestaw znaków na UTF-8