2012-07-26 12 views
9

Buduję aplikację internetową PHP i działa ona w UTF-8. Baza danych to UTF-8, strony są podawane jako UTF-8 i ustawiam zestaw znaków za pomocą metatagu na UTF-8. Oczywiście, w przypadku użytkowników korzystających z przeglądarki Internet Explorer i kopiowania z pasterzowania z pakietu Microsoft Office, czasami udaje mi się uzyskać od czasu do czasu wejście do UTF-8.Najlepsza metoda przekształcania danych wprowadzanych przez użytkownika do UTF-8

Idealnym rozwiązaniem byłoby podanie błędu HTTP 400 Bad Request, ale oczywiście nie mogę tego zrobić. Kolejną najlepszą rzeczą jest przekształcenie $_GET, $_POST i $_REQUEST w UTF-8. Czy mimo to widzę, jaki znak koduje dane wejściowe, więc mogę je przesłać do iconv? Jeśli nie, jakie jest najlepsze rozwiązanie?

Odpowiedz

8

Wyjazd mb_detect_encoding() Przykład:

$utf8 = iconv(mb_detect_encoding($input), 'UTF-8', $input); 

Jest też utf8_encode()jeśli zagwarantować, że ciąg jest wprowadzana jako ISO-8859-1.

+0

Oczywiście nie można zagwarantować, że ciąg znaków jest zgodny z ISO-8859-1, ale 'mb_detect_encoding()' wygląda dobrze –

0

W niektórych przypadkach użycie tylko utf8_encode lub ogólnych kontroli jest poprawne, ale możesz stracić niektóre znaki w ciągu znaków. Jeśli możesz zbudować podstawową tablicę/listę ciągów na podstawie różnych typów, na przykład windows, możesz uratować trochę więcej.

if(!mb_detect_encoding($fileContents, "UTF-8", true)){ 
    $checkArr = array("windows-1252", "windows-1251"); 
    $encodeString = ''; 
    foreach($checkArr as $encode){ 
     if(mb_check_encoding($fileContents, $encode)){ 
      $encodeString .= $encode.","; 
     } 
    } 
    $encodeString = substr($encodeString, 0, -1); 
    $fileContents = mb_convert_encoding($fileContents, "UTF-8", $encodeString); 
} 
Powiązane problemy