Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Konwersja plików w php
Forum PHP.pl > Forum > PHP
Amadeusz1213
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:

  1. <form enctype="multipart/form-data" action="odbierz plik.txt" method="post">
  2. <p>Wyslij plik
  3. <input type="file" name="plik" size="30"></p>
  4. <p><input type="submit" value="Wyslij" name="wyslij></p>
  5. </body>


Nie wiem jak otworzyć i skonwertować plik, który jest wczytany na serwerze. Proszę o pomoc.
Crozin
1. Wgranie pliku na serwer: https://www.google.pl/webhp?sourceid=chrome...20file%20upload
2. Wczytanie zawartości pliku: file_get_contents
3. Rozpoznanie i zmiana kodowania znaków: mb_detect_encoding, mb_convert_encoding
4. Zapisanie pliku na dysku: file_put_contents
5. Ewentualne pobranie przez przeglądarkę pliku: https://www.google.pl/webhp?sourceid=chrome...file%20download
Amadeusz1213
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.



  1. <meta charset="utf-8" />
  2. <form method="POST" ENCTYPE="multipart/form-data">
  3. Wybierz plik do zakodowania:<br /><br />
  4. <input type="file" name="plik"/><br/><br />
  5. <input type="submit" name="submit" value="Wyślij plik"/>
  6. </form>

  1. <?
  2. if(isset($_POST['submit']))
  3. {
  4. $max_rozmiar = 1024*1024;
  5. $nazwa_tymcz = $_FILES['plik']['tmp_name'];
  6. if(is_uploaded_file($nazwa_tymcz))
  7. {
  8. if($_FILES['plik']['size'] > $max_rozmiar)
  9. {
  10. echo "Błąd! Plik jest za duży! Maksymalny rozmiar to: ".$max_rozmiar."B<br />";
  11. }
  12. else
  13. {
  14. $nazwa = $_FILES['plik']['name'];
  15. move_uploaded_file($nazwa_tymcz, 'pliki/'.$nazwa);
  16. $ile = strlen($nazwa);
  17. $ext = $nazwa[$ile-3].$nazwa[$ile-2].$nazwa[$ile-1];
  18. if($ext=="TXT" || $ext=="txt")
  19. {
  20. $tekst = file_get_contents('pliki/'.$nazwa);
  21. $kodowanie1 = iconv_get_encoding($tekst);
  22. $koduj = mb_convert_encoding($kodowanie1, 'Windows 1250', 'iso-8859-2');
  23. $kodowanie2 = iconv_get_encoding($koduj);
  24.  
  25. if(!file_exists('pliki/plik.iso'))
  26. {
  27. touch('pliki/plik.iso');
  28. }
  29. file_put_contents('pliki/plik.iso', $kodowanie2);
  30. echo "<a href=\"pliki/plik.iso\">POBIERZ ZAKODOWANY PLIK</a>";
  31. }
  32.  
  33. else[html][/html]
  34. {
  35. echo "Błąd, złe rozszerzenie pliku.";
  36. }
  37. }
  38. }
  39. }
  40. ?>
Xelah
Crozin troszkę wprowadził cię w błąd: http://php.net/manual/de/mbstring.supported-encodings.php

Funkcje "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
A jak mam napisac taką porównywarkę, bo chcę, żeby wywalało błąd kiedy wczytam pliki w kodowaniu innym niż Windows 1250?
Xelah
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 :/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.