Amadeusz1213
4.05.2015, 09:09:33
Witam.Mam problem z pewnym zadaniem. Treść jego jet następująca:
Napisz aplikację konwertującą ze standardu Windows-1250 do standardu ISO-8850-2. Aplikacja powinna wczytywać plik w formacie Windows 1250 i zapisywać plik skonwertowany z rozszerzeniem "ISO".
Napisałem formularz na wczytanie pliku na serwer, który wygląda tak:
<form enctype="multipart/form-data" action="odbierz plik.txt" method="post"> <input type="file" name="plik" size="30"></p> <p><input type="submit" value="Wyslij" name="wyslij></p>
Nie wiem jak otworzyć i skonwertować plik, który jest wczytany na serwerze. Proszę o pomoc.
Crozin
4.05.2015, 09:28:13
Amadeusz1213
17.05.2015, 19:46:57
Potrzebuję pomocy z tym programem. Kiedy próbuję konwertować plik wyskakuje mi taki komunikat :Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unknown encoding "Windows-1250" in D:\Program Files (x86)\WebServ\httpd\index.php on line 29.
<form method="POST" ENCTYPE="multipart/form-data"> Wybierz plik do zakodowania:
<br /><br /> <input type="submit" name="submit" value="Wyślij plik"/>
<?
if(isset($_POST['submit'])) {
$max_rozmiar = 1024*1024;
$nazwa_tymcz = $_FILES['plik']['tmp_name'];
{
if($_FILES['plik']['size'] > $max_rozmiar)
{
echo "Błąd! Plik jest za duży! Maksymalny rozmiar to: ".$max_rozmiar."B<br />"; }
else
{
$nazwa = $_FILES['plik']['name'];
$ext = $nazwa[$ile-3].$nazwa[$ile-2].$nazwa[$ile-1];
if($ext=="TXT" || $ext=="txt")
{
$kodowanie1 = iconv_get_encoding($tekst);
$koduj = mb_convert_encoding($kodowanie1, 'Windows 1250', 'iso-8859-2');
$kodowanie2 = iconv_get_encoding($koduj);
{
}
file_put_contents('pliki/plik.iso', $kodowanie2);
echo "<a href=\"pliki/plik.iso\">POBIERZ ZAKODOWANY PLIK</a>"; }
else[html][/html]
{
echo "Błąd, złe rozszerzenie pliku."; }
}
}
}
?>
Xelah
18.05.2015, 10:31:51
Crozin troszkę wprowadził cię w błąd:
http://php.net/manual/de/mbstring.supported-encodings.phpFunkcje "mb_" nie obsługują Windows-1250.
Nie będziesz w stanie wykryć różnicy pomiędzy ISO-8859-2 a Windows-1250. Musisz zaufać, że źródło jest w Windows-1250 i użyć
http://php.net/manual/en/function.iconv.php do zmiany kodowania.
Mógłbyś napisać własną porównywarkę kodowania, ale ona nigdy nie będzie w 100% skuteczna.
Niestety Windows-1250 sucks.
Edit:
Kodowanie Windows-1250 nazywa się CP1250.
Amadeusz1213
19.05.2015, 17:38:39
A jak mam napisac taką porównywarkę, bo chcę, żeby wywalało błąd kiedy wczytam pliki w kodowaniu innym niż Windows 1250?
Xelah
20.05.2015, 07:13:36
Jak już napisałem wcześniej, nie jesteś w stanie powiedzieć, czy dane kodowanie to Windows-1250. Możesz się pobawić w następujący sposób:
1. mb_detect_encoding ze strict ustawionym na true w celu sprawdzenia, czy to jest kodowanie, które mb obsługuje.
2. Jeśli nie to sprawdzasz, czy zadany string zawiera znaki z przedziału 0x00-0x1F lub 0x7F-0x9F. Jeśli tak, to na pewno nie jest ISO, bo layout-y ISO nie mają pod tymi kodami znaków.
Teraz możesz, z dosyć dużym prawdopodobieństwem, powiedzieć, że to może być CP1250. A czy jest? Tego się nie dowiesz, bo inne kodowania z CP mają znaki z tego same zakresu (nie wszystkie ale to musiałbyś znowu porównywać wsztkie code page layout-y i dalej nie będziesz miał 100% pewności).
To jest tylko brzydki workaround, który na pewno nie rozwiąże problemu. Niestety albo wymusisz na userze, żeby nie ładował niczego w innego niż UTF-8 albo skończysz z rozkwaszonymi znakami tu i ówdzie :/