2011-10-28 15 views
5

Obecnie próbuję usunąć wszystkie znaki specjalne i akcenty z ciągu znaków UTF-8, zamieniając je w ich równoważny znak ASCII, jeśli to możliwe.Dlaczego ikonki PHP potrzebują setlocale?

Więc jestem po prostu za pomocą tego kodu:

$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

Problemem jest to, że na przykład słowo „debiut” zamienia się w „dbut” zamiast „debiut”. Aby działać, muszę dodać wywołanie do setlocale, tak:

setlocale(LC_ALL, 'en_US.UTF8'); 
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

A ja nie rozumiem dlaczego. Myślałem, że UTF-8 i ASCII są zawsze takie same, niezależnie od tego, z jakiego regionu korzystasz.

EDIT: Nie chciałem UTF-8 jest równa ASCII, chciałem UTF-8 zawsze równa UTF-8 i ASCII zawsze równa ASCII

+0

ASCII i UTF-8 nie są takie same. UTF-8 jest większy o rząd wielkości. – NikiC

Odpowiedz

1

podgrupie UTF-8, który pokrywa się z ASCII (co jest kod punkty 0-127) jest rzeczywiście identyczny z ASCII. Jednak znaki alfabetu łacińskiego akcentowane nie są częścią zestawu znaków ASCII, a jeśli użytkownik nie jest sam w sobie, domyślne ustawienia regionalne systemu (które oczywiście nie zawierają tych znaków akcentowanych) są używane do uzyskania zestawu znaków do pracy.

Ogólnie rzecz biorąc, iconv może być trochę niepewny; to jest wymienione w introduction rozszerzenia:

Ten moduł zawiera interfejs do iconv konwersja zestawu znaków siłownia. Za pomocą tego modułu można przekształcić ciąg znaków reprezentowany przez lokalny zestaw znaków w jeden reprezentowany przez inny zestaw znaków, , który może być zestawem znaków Unicode. Obsługiwane zestawy znaków zależą od implementacji iconv systemu. Należy pamiętać, że funkcja iconv na niektórych systemach może nie działać zgodnie z oczekiwaniami. W takim przypadku, , warto zainstalować bibliotekę libiconv GNU. Najprawdopodobniej uzyska on bardziej spójne wyniki.

Powiązane problemy