jQuery i JSON polskie znaki

0

Witam,
kolejne pytanie z serii jQuery i ajax. Tym razem przerobiłem kod tak by pobierał wynik jako JSON. Problem tkwi w tym że jak ma przesłać text z polskimi znakami to przerywa tekst.

<?php
$tekst = "to jest jakiś tekst";
$arr = array("wynik" => $tekst);
echo json_encode($arr);
?>
	$.ajax({
		url: 'plik.php',
		...
		dataType: 'json',
		success: function(data) {
			alert(data.wynik);
		}
	});

Efekt jest taki że przesyła tylko: "to jest jaki". Co można zrobić by json przesyłał polskie znaki ? Ustawiałem w pliku też nagłówek i sprawdzałem w kodowaniach: iso-8859-2, windows-1250, utf-8.

0

W całym swoim projekcie ustaw KAŻDY plik na utf-8 (bez BOM). czy to js, czy to css, czy to php, html itd.
Potem definiuj w header() kodowanie jako utf-8. Przeglądarkę na stronie dołączającej plik JS z wywołaniem ajax też poinstruuj, że ma do czynienia z utf-8.

Jeżeli nie pomoże to pozbądź się dataType - nigdy tego nie używałem, nie wiem jak to się zachowuje (szczególnie, jeżeli NIE otrzyma JSON jako zwrotkę), może tu jest przyczyna?
Weź sobie tę funkcję: http://phpjs.org/functions/json_decode:456
Następnie nią traktuj zmienną data w success.
Mniej więcej coś takiego:

{
  success: function(json) {
    var data = json_decode(json);
    if (data==json) { // jeżeli dekodowanie json się nie powiedzie to funkcja zwróci taki sam string jak dostała
      alert('niepoprawny json przyszedł od serwera');
    }
    else {
      if (data.wynik) { alert(data.wynik); }
    }
  }
}
0

Oczywiście sprawdzę to.

Kurcze nie słyszałem nigdy o BOM. Zawsze bawiłem się z ustawianiem iso-8859-2 i funkcjami iso2utf lub iso2win lub odwrotnie. Czy ustawiając każdy plik jako utf-8 mam polskie znaki pisać normalnie, czy znaleźć w internecie "krzaczki", które je zastępują ?

A co z bazą danych ? Też utf-8 ? Nie wiem czemu mam latin-2

0

w czym piszesz w ogole?
bo wyglada mi na to ze w notatniku (ten fragment o szukaniu 'krzaków' w internecie o.O). notatnik nie wspiera utf-8 bez bom, zawsze doklei bom.

edit: co do bazy:

  1. wszystko na utf-8 (jak już masz bazę to problem, bo nie wiem jak po ludzku to skonwertować. wiem, że zawsze są z tym problemy przy imporcie/eksporcie jezeli baza NIE jest w utf).
  2. zaraz po utworzeniu połączenia wykonuj:
    SET CHARACTER SET utf8
    oraz
    SET NAMES utf8
0

Piszę w Notepad++

0

tam sie raczej da wiec wybrac kodowanie plikow. BEZ szukania krzakow po internecie o.O
co do bazy masz w edicie wyżej.

0

Właśnie zmieniłem na UTF-8 bez BOM, chyba że ma być z.

W połączeniu z bazą mam: mysql_set_charset() - właśnie zmieniłem z latin na utf. Teraz już nie będę musiał ustawiać SET NAMES i SET CHARACTER SET ?
Rozumiem że w bazie mysql mam też pozmieniać na utf-8.

Zacząłem też ustawiać wszystko zgodnie z tym: http://kissdesign.pl/166/trzy-sposoby-na-kodowanie-znakow-w-xhtml.html - tylko nie wiem czy serio w każym pliku mam dać nagłówek ? Czy chodzi tylko o pliki dołączane ?

Jutro będę dalej bawił się w zmianę z iso na utf wszystkiego. Jak masz jakieś jeszcze uwagi to proszę napisz.

0

bez BOM, to wiem na pewno. BOM może zrobić Ci odstęp na górze strony (i przy każdym miejscu gdzie dołączasz nowy plik z BOM), uniemożliwić skorzystanie z header() - zawsze już coś będzie wysłane do użytkownika.

mysql_set_charset() - nie uzywam tego. ale to chyba nie takie trudne wywołać dwa zapytania po utworzeniu połączenia?. jeżeli tylko masz jakąś klasę do mysql to zaden problem.

w bazie pozmieniaj, ale nie wiem co wtedy stanie sie z danymi w bazie. zrób kopię zapasową bazy. potem zmień ustawienia kodowania bazy, tabel itd. jeżeli dane się zepsują - zostaw, potem będziemy się tym martwić.

Jeżeli dołączasz pliki, no to header() tylko w tym głównym (index.php zapewne), ALE "fizycznie" (czy jak to nazwać) wszystkie pliki mają być w UTF-8 (no bo deklaracja jedno, a faktyczny sposób zapisu znaków to drugie).

Jak już poustawiasz te utfy to sobie sprawdź tego ajaxa. Potem zostanie ew. naprawa danych w bazie.

0
dzek69 napisał(a):

W całym swoim projekcie ustaw KAŻDY plik na utf-8 (bez BOM). czy to js, czy to css, czy to php, html itd.
Potem definiuj w header() kodowanie jako utf-8. Przeglądarkę na stronie dołączającej plik JS z wywołaniem ajax też poinstruuj, że ma do czynienia z utf-8.

Jeżeli nie pomoże to pozbądź się dataType - nigdy tego nie używałem, nie wiem jak to się zachowuje (szczególnie, jeżeli NIE otrzyma JSON jako zwrotkę), może tu jest przyczyna?
Weź sobie tę funkcję: http://phpjs.org/functions/json_decode:456
Następnie nią traktuj zmienną data w success.
Mniej więcej coś takiego:

{
  success: function(json) {
    var data = json_decode(json);
    if (data==json) { // jeżeli dekodowanie json się nie powiedzie to funkcja zwróci taki sam string jak dostała
      alert('niepoprawny json przyszedł od serwera');
    }
    else {
      if (data.wynik) { alert(data.wynik); }
    }
  }
}

Jakie json_decode? Bodajże jQuery udostępnia wszystko co trzeba do kodowania/dekodowania JSON. Ba! Przeglądarki dają: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/parse

0

@Demonical Monk:
Nawet jeszcze więcej -- nie tylko przeglądarki to dają. Od ECMAScriptu 5, obiekt JSON -- wraz z metodami parse() oraz stringify() -- jest integralnym elementem języka. Definiuje to standard ECMA-262, edycja 5 (wersja HTML: http://es5.github.com/#x15.12 ). Znaczy to, że obiekt JSON jest dostępny we wszystkich środowiskach wykonawczych zgodnych z oficjalnym standardem JavaScriptu. Oprócz przeglądarek, będzie to np. NodeJS. Obiekt JSON stał się tak samo integralną częścią języka, jak np. obiekt Math! (w przeciwieństwie do np. obiektów document czy window, charakterystycznych dla przeglądarek).

Oczywiście, IE7 ma na ten temat własne zdanie i obiektu JSON tam nie ma, podobnie jak wielu innych elementów ES5. W IE8 już na szczęście JSON jest obsługiwany natywnie.

W razie czego, można skorzystać z jQuery -- jeśli i tak mamy je dołączone -- albo z biblioteki json2 Douglasa Crockforda, twórcy formatu JSON: https://github.com/douglascrockford/JSON-js/blob/master/json2.js

0

Hm. Używałem tego ze względu na IE, nie wiedziałem też, że IE8 już to potrafi, ot stare przyzwyczajenie ;)
O jQuery tak samo nie pomyślałem, używam sobie tamtego parsera od zawsze. Ale oki, widzę, że pora się przerzucić, ja się w <= IE7 już nie bawię, dzięki

0

Jak przestawiłem kodowanie plików na UTF-8 bez BOM, oraz dałem nagłówek meta jako utf-8 to wszystko zaczęło ładnie działać poza połączeniem z bazą danych.

Mam tak że nie ustawiam SET NAMES i SET CHARSET, lecz używam funkcji set_character_set('utf8', $var). W bazie mam Sortowanie połączenie z serwerem na utf8_general_ci, a poszczególne tabele jako latin2_general_ci. Przestawiłem Metoda porównywania napisów na utf8_general_ci i nic to nie dało.

Czy teraz to tylko kwestia tego że dodając pole z poziomy bazy dodaję polskie listery w kodowaniu iso ?

0

Chodzi Ci o mysql_set_charset?
Poszczególne tabele też miej jako utf-8, ja nie wiem jak się mysql zachowa na czymś takim.

"dodając pole z poziomy bazy" -- o czym mówisz? o phpMyAdmin? tam Ci doda zapewne tak, jak będzie kodowanie bazy ustawione.

0

Tak mysql_set_charset(), coś mi się w głowie poprzestawiało. Wszystko w MySQL ustawiłem na utf8_general_ci i dodałem nowy rekord (z poziomu bazy danych - poprzez phpmyadmin) i nadal źle odczytuje znaki.

0

Proszę zamknąć ten temat, ponieważ założyłem oddzielny: http://4programmers.net/Forum/PHP/201536-php_i_mysql_-_kodowanie_utf8

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