![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Muszę pobrać dane z zewnętrznego pliku CSV.
Wszystko cacy, ale całość rozbija się o kodowanie znaków. Ten kto stworzył tego CSV zakodował tak znaki, że nie mogę dojść do ładu i składu, więc może ktoś z forum ma większe doświadczenie w tym hardkorze. W sumie muszę zawartość zakodować do iso-8859-2 i nakarmić tym bazę MySQL. Sądząc po długości stringa, kodowanie jest dwubajtowe na znak, czyli np. "tekst" wg strlen zajmuje 11. Więc po kolei: 1. Gdy CSV testowo importuję do Openoffice Calc, to prawidłowe polskie znaki są, gdy wybiorę "Unicode", gdy wybiorę "Unicode (UTF-7)" lub "Unicode (UTF-8)" to mam krzaki. 2. Grzegżółka twierdzi że kodowanie to "Kodowanie: Unicode UCS2 LE (Intel)", ale mb_convert_encoding($tekst,"ISO-8859-2","ucs-2le") daje w wyniku krzaczki (inne wariancje ucs też) 3. Z poziomu php funkcja mb_detect_encoding twierdzi że kodowanie to UTF-8 (lub ASCII gdy nie ma w polu polskich znaczków), ale mb_convert_encoding($tekst,"ISO-8859-2","UTF-8") daje w wyniku krzaczki (przeglądarka jest ustawiona na iso-8859-2). 4. rozzłoszczony zużytym na poszukiwania czasem zrobiłem pętęlkę:
i żaden wynik w przeglądarce nie wygląda prawidłowo. Tak więc chwilowo nie mam pomysłu i jestem otwarty na propozycje jak mogę jeszcze ten temat ugryźć.... |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Weź sobie całe źródło zrzuć do heksadecymalnej formy zapisu bajtów, a następnie w jakimś edytorze HEX (Notepad++ ma plugin, PSPad ma wbudowany) zobacz jakie bajty odpowiadają charakterystycznym znaczkom (np. "a", "ś", "<"). Wiedząc już jakie bajty reprezentują dany znak łatwo będzie znaleźć jakie jest to kodowanie.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Weź sobie całe źródło zrzuć do heksadecymalnej formy zapisu bajtów, a następnie w jakimś edytorze HEX (Notepad++ ma plugin, PSPad ma wbudowany) zobacz jakie bajty odpowiadają charakterystycznym znaczkom (np. "a", "ś", "<"). Wiedząc już jakie bajty reprezentują dany znak łatwo będzie znaleźć jakie jest to kodowanie. Zdanie: Poznań W hexie jest: 5000 6F00 7A00 6E00 6100 4401 Łódź = 4101 F300 6400 7A01 ę = 1901 ł = 4201 czyli na pierwszy rzut oka jest to jakiś unicode Ten post edytował skleps 13.12.2011, 10:16:27 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Wygląda to na UTF-16LE.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Myślałem podobnie, ale
w przeglądarce ustawionej na iso-8859-2 wyświetla się: ![]() ![]() ![]() ![]() ![]() Kawałek pliku CSv wrzuciłem pod adresem: http://chomikuj.pl/iksow/Dokumenty/plikcsv,1241323892.csv |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
W pliku mamy BOM (0xFF 0xFE), nazwy miast oddzielone średnikiem oraz znak nowej linii (CRLF) - wszystko wskazuje na to, że jest to UTF-16LE.
Sprawdź czy mb_convert_encoding / iconv poprawnie konwertuje tekst na ISO-8859-2 - ta sama metoda, podejrzyj wygenerowane bajty. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Na razie dostałem odpowiedź "na około" że jest to zapisany wynik zapytania z bazy.
W pliku wynikowym dostaję 3F3F3F3F3F3F3F3F Jeśli zas zrobię mb_convert_encoding($tekst,"iso-8859-2","UCS-2"); to w pliku Łódź = 41 3F 64 7A Powoll zaczynam dojrzewać do myśli, że napiszę własną funkcję konwertującą, na chama wypisze sobie wszystkie literki i interesujące mnie znaczki... Ten post edytował skleps 13.12.2011, 11:40:30 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Sprawdziłem na swoim serwerze i działa to niemal bez problemów - nie radzi sobie jedynie z BOM-em, ale tego można od biedy przyciąć: Można też pominąć informację o kolejności bajtów (podając samo UTF-16), wtedy też odczyta to sobie na podstawie BOM-u i poprawnie go odczyta. W takim przypadku radziłbym upewnić się czy aby na pewno problemem nie jest samo wyświetlanie tekstu w przeglądarce oraz czy aby na pewno PHP w Twoim przypadku wspiera UTF-16/UTF-16LE. Ten post edytował Crozin 13.12.2011, 11:45:22 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
W takim przypadku radziłbym upewnić się czy aby na pewno problemem nie jest samo wyświetlanie tekstu w przeglądarce Odpada, wtedy w wygenerowanym pliku byłoby dobrze, ale źle się wyświetlało. czy aby na pewno PHP w Twoim przypadku wspiera UTF-16/UTF-16LE. To może być prędzej - jak to można sprawdzić? Serwer to vps na debianie, być może faktycznie czegoś mu brakować, bo instalacja w miarę standardowa. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
no nie, to to od razu sprawdziałem wcześniej
i wynik:
Bardziej myślałem że to może jakiś błąd pliku, błąd generowania pliku lub błąd w obsłudze kodowania mimo tego, że na liście jest. Ten post edytował skleps 13.12.2011, 12:03:37 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 286 Pomógł: 12 Dołączył: 23.11.2006 Skąd: WL Ostrzeżenie: (0%) ![]() ![]() |
żaden wynik w przeglądarce nie wygląda prawidłowo. Tak więc chwilowo nie mam pomysłu i jestem otwarty na propozycje jak mogę jeszcze ten temat ugryźć.... Zrobiłem kilka testów i równierz mam krzaczki na iso, tak więc ustawienia przeglądarki odpadają i ustawienia serwera także... Gdy konwertowałem na utf8 to bodajże 3 były OK ale przy kodowaniu utf8.. Ten post edytował szmerak 13.12.2011, 14:30:57 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
No i chyba wiem, czemu Crozin ma dobrze a ja i ew. inni źle. Natrknąłem się w sieci na informację:
"Nie da się odczytać pliku, zawierającego polskie ogonki, zakodowanego w UTF-16LE (standard Windowsa, pliki wypluwane np. przez PowerShella) przy użyciu funkcji php file(). Tzn. można ale przy konwersji iconv() dostajemy i tak chińskie krzaki. Plik trzeba odczytać przy pomocy file_get_contents() i wtedy już ładnie konwertuje. Dopiero potem można bawić się w cięcie stringa w tablicę." Sprawdzę to i ew. zamkniemy temat... EDIT: Sprawdziłem, faktycznie jest jakiś bug w php i podsumowanie: Jeśli zaczytujemy plik tekstowy / csv z pliku zakodowanego "UTF-16LE" to należy plik wczytać funkcją file_get_contents() ! Ten post edytował skleps 14.12.2011, 00:03:59 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 07:32 |