Jak wykryć zniekształcony ciąg utf-8 w PHP?

Funkcja Iconv czasami daje mi błąd:

Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]

Czy istnieje sposób na wykrycie, że w ciągu utf-8 są nielegalne znaki przed umieszczeniem danych w inconv ?

Author: hakre, 2011-07-17

4 answers

Po pierwsze, zauważ, że nie jest możliwe wykrycie, czy tekst należy do określonego niepożądanego kodowania. Można tylko sprawdzić, czy ciąg znaków jest poprawny w danym kodowaniu.

Możesz skorzystać z kontroli ważności UTF-8, która jest dostępna w preg_match [Instrukcja PHP] od PHP 4.3.5. Zwróci 0 (bez dodatkowych informacji), jeśli podany zostanie nieprawidłowy ciąg znaków:

$isUTF8 = preg_match('//u', $string);

Inną możliwością jest mb_check_encoding [PHP Instrukcja obsługi]:

$validUTF8 = mb_check_encoding($string, 'UTF-8');

Inną funkcją, której możesz użyć, jest mb_detect_encoding [Instrukcja PHP]:

$validUTF8 = ! (false === mb_detect_encoding($string, 'UTF-8', true));

Ważne jest, aby ustawić parametr strict na true.

, iconv [Instrukcja PHP] umożliwia zmianę / upuszczenie nieprawidłowych sekwencji w locie. (Jednakże, jeśli iconv napotka taką sekwencję, generuje powiadomienie; tego zachowania nie można zmienić.)

echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $string), PHP_EOL;

Możesz użyć @ i sprawdź długość łańcucha zwrotnego:

strlen($string) === strlen(@iconv('UTF-8', 'UTF-8//IGNORE', $string));

Sprawdź również przykłady na stronie podręcznika iconv.

Nie udostępniłeś kodu źródłowego, z którego wynika powiadomienie. Powinieneś go dodać, jeśli chcesz bardziej konkretną sugestię.

 47
Author: hakre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-10 16:18:09

Możesz spróbować użyć mb_detect_encoding, aby wykryć, czy masz inny zestaw znaków (niż UTF-8), a następnie mb_convert_encoding przekonwertować na UTF-8, jeśli jest to wymagane. Jest bardziej prawdopodobne, że ludzie podają poprawną treść w innym zestawie znaków niż podają niepoprawne UTF-8.

 0
Author: Robin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-17 11:41:12

Specyfikacja znaków, które są nieprawidłowe W UTF-8, jest dość jasna. Pewnie chcesz je rozebrać, zanim spróbujesz je przeanalizować. Nie powinno ich tam być, więc jeśli można go uniknąć nawet przed wygenerowaniem XML, który byłby jeszcze lepszy.

Zobacz tutaj dla odniesienia:

Http://www.w3.org/TR/xml/#charsets

To nie jest kompletna lista, wiele parserów również nie zezwala na niektóre znaki sterujące o niskich numerach, ale nie mogę znaleźć wyczerpującej listy teraz.

Jednak iconv może mieć wbudowane wsparcie dla tego:

Http://www.zeitoun.net/articles/clear-invalid-utf8/start

 0
Author: jishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-17 11:47:00

Umieść @ przed iconv (), aby wyłączyć powiadomienie i / / Ignoruj po UTF-8 W id kodowania źródłowego, aby zignorować nieprawidłowe znaki:

@iconv( 'UTF-8//IGNORE', $destinationEncoding, $yourString );
 0
Author: nobody,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-17 11:51:42