Wykrywanie kodowania znaków z inputa

0

Cześć, mam problem z wykryciem kodowania znaków tekstu wpisanego w inputa, lub pobranego z pliku lub tez wpisanego ręcznie do zmiennej. Używam do tego funkcji

mb_detect_encoding()

Dla przykładu wpisze tekst

GDAĹSK

który jest zakodowany w iso-8859-2. Potem próbuje wykryć kodowanie znaków i konwertuje to na utf8

$text = 'GDAĹSK';

echo $text . " - "; 
echo mb_detect_encoding($text) . "<br>"; // Powinno zwrócić iso-8859-2

$text = mb_convert_encoding($text, 'iso-8859-2', 'utf-8'); // konwersja z iso na utf8

echo $text . " - ";
echo mb_detect_encoding($text) . "<br>"; // Powinno zwrócić utf-8

A na wyjściu dostaję
title

Ta funkcja zwraca mi zawsze UTF-8 jezeli uzywam jakiś np. polskich ogonków czy innych dziwnych znaków i ASCII jezeli uzywam tylko angielskiego alfabetu. A potrzebuję wykryć kiedy jest kodowanie iso-8859-2, kiedy windows-1250, a kiedy utf8. Jak ktoś ma jakiś pomysł to prosze o pomoc ;)

3

Trochę nie bardzo rozumiem problem. Ustawiasz kodowanie pliku jako UTF-8, w nagłówku strony dajesz charset=utf-8" i nie zastanawiasz się więcej nad kwestią kodowania znaków.

Funkcje przekodowujące służą do pracy z zewnętrznymi plikami w innym kodowaniu. To co wpiszesz do inputa na prawidłowo zrobionej stronie będzie zawsze poprawne. No chyba, że celowo chcesz czemuś wklejać w ten input teksty z połamanym kodowaniem?

Jeśli to drugie, to może zrób sobie po prostu tablicę zamian i nią potraktuj, te krzaki? Poniżej coś, co sobie kiedyś napisałam.
Uwaga: zamienia wszystkie ą, ę itp we wszystkich możliwych kodowaniach na a, e, więc trzeba sobie przerobić.

$tabela = Array(
"\x20" => "_",
//utf
"\xC3\x93" => "o",
"\xC3\xB3" => "o",
"\xC4\x84" => "a",
"\xC4\x85" => "a",
"\xC4\x86" => "c",
"\xC4\x87" => "c",
"\xC4\x98" => "e",
"\xC4\x99" => "e",
"\xC5\x81" => "l",
"\xC5\x82" => "l",
"\xC5\x83" => "n",
"\xC5\x84" => "n",
"\xC5\x9A" => "s",
"\xC5\x9B" => "s",
"\xC5\xB9" => "z",
"\xC5\xBA" => "z",
"\xC5\xBB" => "z",
"\xC5\xBC" => "z",
//utf (zepsute)
"\xE3\x93" => "o",
"\xE3\xB3" => "o",
"\xE4\x84" => "a",
"\xE4\x85" => "a",
"\xE4\x86" => "c",
"\xE4\x87" => "c",
"\xE4\x98" => "e",
"\xE4\x99" => "e",
"\xE5\x81" => "l",
"\xE5\x82" => "l",
"\xE5\x83" => "n",
"\xE5\x84" => "n",
"\xE5\x9A" => "s",
"\xE5\x9B" => "s",
"\xE5\xB9" => "z",
"\xE5\xBA" => "z",
"\xE5\xBB" => "z",
"\xE5\xBC" => "z",  
//iso
"\xB1" => "a",
"\xE6" => "c",
"\xEA" => "e",
"\xB3" => "l",
"\xF1" => "n",
"\xF3" => "o",
"\xB6" => "s",
"\xBC" => "z",
"\xBF" => "z",
"\xA1" => "a",
"\xC6" => "c",
"\xCA" => "e",
"\xA3" => "l",
"\xD1" => "n",
"\xD3" => "o",
"\xA6" => "s",
"\xAC" => "z",
"\xAF" => "z",
//win
"\xA5" => "a",
"\xC6" => "c",
"\xCA" => "e",
"\xA3" => "l",
"\xD1" => "n",
"\xD3" => "o",
"\x8C" => "s",
"\x8F" => "z",
"\xAF" => "z",
"\xB9" => "a",
"\xE6" => "c",
"\xEA" => "e",
"\xB3" => "l",
"\xF1" => "n",
"\xF3" => "o",
"\x9C" => "s",
"\x9F" => "z",
"\xBF" => "z"
);
1

jest taka funkcja
mb_check_encoding($text, 'iso-8859-2')

0

@gk1982: Ta funkcja tez mi nie działa. zwraca 1, a po konwersji na utf8 tez zwraca 1

echo "Check iso: " . mb_check_encoding($text, 'iso-8859-2'); // 1
$text = mb_convert_encoding($text, 'iso-8859-2', 'utf-8');
echo "Check iso: " . mb_check_encoding($text, 'iso-8859-2'); // 1

@Freja Draco Po prostu takie zadanie, żeby zrobić "metode która przyjmuje jako parametr tekst w kodowaniu windows-1250 lub iso-8859-2 lub utf8. Metoda powinna rozpoznać w jakim kodowaniu jest tekst i zwrócić w utf8." I mam problem właśnie z tym rozpoznaniem kodowania. Nawet jak w meta tagu wpisze np. charset="iso-8859-2", to i tak wykrywa mi to utf8. Czy to przez to ze plik jest w utf8 i wszystko co przyjdzie z inputa jest konwertowane do utf8? I czemu nawet jak funkcją przekonwertuje na inne kodowanie to nadal pokazuje utf8?

I jeszcze jedno pytanko, jakbym chcial wykryć kodowanie zewnętrznego pliku przesłanego przez input file. To jak to zrobic? Jest jakaś funkcja od tego, czy musze pobrać tekst z tego pliku i go sprawdzić?

3

Źle to sprawdzasz to raz:

$text = 'GDAĹSK'; // Plik masz zakodowany na UTF8 więc dla programu znaczy że chciałeś wpisać dziwne znaczki zamiast "Ń"

Zrób sobie drugi plik z ustawionym jakimś kodowaniem typu ISO i z niego pobieraj testowe wartości.

Zobacz sobie zresztą coś takiego:

<?php
$pl1 ='ą';
echo bin2hex($pl1);// jak widzisz ponieważ mam plik w UTF-8 to zwraca odpowiedniki hex dla UTF-8
echo "<br>";
$pl2 ='ń';
echo bin2hex($pl2);// jak widzisz ponieważ mam plik w UTF-8 to zwraca odpowiedniki hex dla UTF-8
echo "<br>";
$text = 'gda'."\xF1".'sk'."\xB1";// gdańską w ISO-8859-2
echo $text;
echo "czy iso? :".mb_detect_encoding($text,"ISO-8859-2",true);
echo "czy utf? :".mb_detect_encoding($text,"UTF-8", true);
echo "<br>";
//konwertujemy sobie tego stringa
$converted = iconv("ISO-8859-2","UTF-8", $text);
echo "skonwertowane: ". $converted;
echo "<br>";
echo "skonwertowane w hex: ". bin2hex($converted);
echo "<br>";

$text1 = 'gda'."\xc5\x84".'sk'."\xc4\x85";// gdańską w UTF-8
echo $text1;
echo "<br>";
echo "czy iso? :".mb_detect_encoding($text1,"ISO-8859-2", true);
echo "<br>";
echo "czy utf? :". mb_detect_encoding($text1,"UTF-8", true);
3
Codin napisał(a):

@Freja Draco Po prostu takie zadanie, żeby zrobić "metode która przyjmuje jako parametr tekst w kodowaniu windows-1250 lub iso-8859-2 lub utf8.

Ale to jest powiedziane, że to ma iść przez input? Bo metoda z każdorazowym zmienianiem meta charset dokumentu jest trochę dziwna :)

mam problem właśnie z tym rozpoznaniem kodowania. Nawet jak w meta tagu wpisze np. charset="iso-8859-2", to i tak wykrywa mi to utf8.

Zrób sobie tester:

<!DOCTYPE html>
<html>
<head>
<meta charset="iso-8859-2">
<title></title>

<style>
</style>
</head>
<body>

<form action="" method="post">
  <input name="txt">
</form>

<?php 
$txt = "";
$txt = $_POST["txt"];

$txt_iso = mb_check_encoding($txt, 'iso-8859-2');
$txt_utf = mb_check_encoding($txt, 'utf-8');

echo("$txt<br>");
echo("iso - $txt_iso<br>");
echo("utf - $txt_utf<br>");

$plik = 'test_charset.txt';
file_put_contents($plik, $txt);
?>

</body>
</html>

Teksty zawierające znaki o kodach do 127, czyli kodowane 7-bitami są poprawnym stringiem tak iso jak utf. Dopiero jak poślesz tam np. ą, to będzie wiadomo, że to nie może być utf.

patrz:
https://pl.wikipedia.org/wiki/UTF-8
https://pl.wikipedia.org/wiki/ISO_8859-2

Czy to przez to ze plik jest w utf8 i wszystko co przyjdzie z inputa jest konwertowane do utf8?

Nie. Chyba, żebyś miał jakoś dziwnie serwer skonfigurowany, tak żeby ignorował kodowanie ustawione w dokumencie, ale wątpię.

I jeszcze jedno pytanko, jakbym chcial wykryć kodowanie zewnętrznego pliku przesłanego przez input file. To jak to zrobic? Jest jakaś funkcja od tego, czy musze pobrać tekst z tego pliku i go sprawdzić?

Musisz pobrać i sprawdzić.

0

Chyba będe musiał poczytać o tych kodowaniach i zrobić jakąś własną funkcję bo te mb to sie nie nadają, z tego czytam to lubią zwracać nieprawidłowe kodowanie, a co więcej nie obsługują windows-1250, dlatego w drugim argumencie $encoding_list przy podaniu 'Windows-1250' zwracało warning illegal argument.

1 użytkowników online, w tym zalogowanych: 0, gości: 1