Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][xml]Funkcja iconv ucina stringi po niektórych encjach
Forum PHP.pl > Forum > Przedszkole
exood
Witam,
mam sobie plik XML z którego potrzebuje wyciągnąć dane. Robię to przez simplexml_load_file(). Xml jak i plik php w którym chcę to wyświetlać są w kodowaniu iso-8859-2. Jak wiadomo stringi w obiekcie stworzonym przez funkcję simplexml_load_file() bedą w UTF-8.
Zastosowałem więc:
  1. $tresc = iconv('UTF-8', 'ISO-8859-2', $tresc);
przed wyświetleniem.
Skrypt sobie działał aż do czasu kiedy w XML znalazł tekst hiszpański. Mówię okej - nie ma problemu zamienimy na encje i szafa gra... i tak grała dopóki niezauważyłem że po konwersji prze iconv() obcina tekst po tylko niektórych encjach... są to np. ñ (ñ), ¡ (¡) czy è (è) ...
czyli mamy:
  1. $plik = simplexml_load_file('test.xml');
  2. $tresc = $plik->pytanie->tresc;
  3. echo $tresc;
  4. echo '<br /><br />';
  5. $tresc = iconv('UTF-8', 'ISO-8859-2', $tresc);
  6. echo $tresc;


co przy stringu: "to jest tekst ñ ¡ è a to dalsza część"
przed iconv() mamy na stronie: "to jest tekst KRZAKI KRZAKI KRZAKI a to dalsza część" - bo string jest utf-ie
a po iconv() mamy: "to jest tekst "

do tej pory rozwiązałem to w sposób taki, że jak już mamy w xmlu encje w postaci &#cyferki; to w encjach zamieniam jeszcze znaki "&" i "#" na encje- i wtedy jest okej, ale moje pytanko - czy nie ma innego rozwiązania żeby to poprawnie wszystko wyświetlać bez przesadnej gimnastyki?
Co radzicie?
Brick
Miałem podobny problem. Iconv nie jest idealny i też mi obcinał tekst gdy trafiał na jakieś nieznane mu znaczki.
Spróbuj dodać switch IGNORE do iconv czyli:

iconv('UTF-8', 'ISO-8859-2//IGNORE', $string);

lub TRANSLIT//IGNORE czyli:

iconv('UTF-8', 'ISO-8859-2//TRANSLIT//IGNORE', $string);

Ale na php.net pisze jeden gość że miał problem z tym drugim. Skrypt się zatrzymywał na pierwszym nieznanym znaku.
exood
Hej,
no niestety nie działa to tak jak potrzeba,
Translit przepisuje mi znaki np: ñ zamienia na ~n, natomiast ¡ zamienia na !
Ignore - pomija nieznane znaki

zależy mi na tym żeby te znaki były wyświetlane - znaki diakrytyczne ważna rzecz smile.gif
Brick
No to wynika z tego że iconv jest do kitu zrobiony.
A mb_string próbowałeś? Dokładnie to mb_convert_encoding()
exood
działa podobnie jak iconv ... z tym, że zamiast ucinania, dostaje "?" zamiast nierozpoznanego znaku.
Brick
A kodowanie w tekście oryginalnym na pewno całe jest w UTF-8"? Może jest wymieszane?
Miałem tak nie raz gdy pierwotnie strona miała kodowanie ISO więc dane zapisywały się ISO. Potem była zmieniona na UTF ale nie dokonano konwersji wszystkich tekstów w bazie. Wynikiem tego była mieszanka różnych kodowań.

Dane po konwersji printujesz na ekran czy zapisujesz do pliku?
exood
Cytat(Brick @ 8.01.2010, 16:24:26 ) *
Dane po konwersji printujesz na ekran czy zapisujesz do pliku?


na ekran.
Brick
A spróbuj zapisać do pliku i popatrz do niego czy to samo zapisał co printuje.
Jakie kodowanie masz ustawione w META tagu?
Spróbuj skasować całkiem ten tag i zobacz co będzie. Sprawdź w Firefox i np w Operze.

Te znaki zapytania miałem właśnie gdy było wymieszane kodowanie. Te dane były zawsze w pliku XML czy trafiły do niego z jakiejś bazy danych?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.