PHP kodowanie pliku tekstowego


(pain3hp) #1

Sciągam dane z bazy danych, obie kolumny są kodowane utf8_polish_ci, i łącze je funkcją CONCAT_WS() w jedność.

Potrzebuję je umieszczać w pliku tekstowym ale ten plik otwiera się w kodowaniu ISO-8859-1, ustawiałem nagłówki PHP Content-type: plain/text; charset=UTF-8 i są krzaki.

co już robiłem;

patrzyłem na plik w różnych edytorach - wszedzie sa krzaki

patrzyłem na wynik w przeglądarce - wtedy jest OK

próbowałem na siłe konwertować wlocie kodowanie funkcja iconv() - nie pomaga

wyciagalem kodowania przez mb_detect_encoing() wtedy wyrzuca prawie co trzecie jako "ASCII" a reszta jest utf-8

do tego wszystkiego jeszcze jest wiele innych danych które też są w utf 8 ale one są poprawne jeżeli są bez tych dwóch kolumn o ktorych pisałem wcześniej, jezeli dodam te kolumny do pliku to wtedy wszystkie znaki utf8 się krzaczą

Prosze o pomysły bo ja juz nie mam :expressionless:


(Marcin Obala) #2

Ja nie siedzę w PHP ale jak wspomniałeś o tym że w locie konwertujesz to może by pomogło zrobienie jakiejś tablicy której indeksem będzie polski znak (a raczej jego kod) w kodowaniu ISO-8859-1 a po drugiej stronie będzie polski znak (jego kod) w kodowaniu UTF-8 i niestety pętelka po wszystkich znakach i ewentualna zamiana i dopiero zapis. Jednak to to powinno być rozwiązanie w ostateczności gdyż dużo zbędnych operacji się wykonuje. Może najpierw ktoś kto miał z tym styczność niech się wypowie.


(pain3hp) #3

z tym że znaki są jeszcze słowackie, węgierskie, czeskie i niemieckie


(Marcin Obala) #4

To byś musiał sporą tabelkę stworzyć z odpowiednikami kodów ISO-8859-1 <-> UTF-8. Ale mówię, to tylko taki mój pomysł bruteforce a poprawne rozwiązanie niech ktoś inny znajdzie.


(mktos) #5

A dane w bazie są na pewno w UTF-8? Próbowałeś wysłać SET NAMES utf8 po nawiązaniu połączenia? Czasami ustawienia połączenia z MySQL są dziwaczne.


(pain3hp) #6

tak i tak nie tylko set names ale także połączenie w utf8 przez mysql_set_charset();


(Dkqmail) #7

Spróbuj może tego kodu:

mysql_query('SET character_set_connection=cp1250');

mysql_query('SET character_set_client=cp1250');

mysql_query('SET character_set_results=cp1250');

P.S.

Możesz zamiast cp1250 wpisać inne kodowanie jakie potrzebujesz.