Piszę usługę sieciową, która używa json do reprezentowania swoich zasobów i trochę utknąłem, myśląc o najlepszym sposobie zakodowania json. Czytając json rfc ( http://www.ietf.org/rfc/rfc4627.txt ) widać, że preferowanym kodowaniem jest utf-8. Ale rfc opisuje również mechanizm ucieczki ciągów do określania znaków. Zakładam, że byłoby to generalnie używane do ucieczki przed znakami spoza ASCII, dzięki czemu wynikowe utf-8 byłoby prawidłowe.
Powiedzmy, że mam ciąg json zawierający znaki Unicode (punkty kodowe), które nie są ASCII. Czy moja usługa sieciowa powinna po prostu zakodować to za pomocą utf-8 i zwrócić to, czy też powinna uciec przed wszystkimi znakami spoza ASCII i zwrócić czyste ASCII?
Chciałbym, aby przeglądarki mogły wykonywać wyniki przy użyciu jsonp lub eval. Czy to wpływa na decyzję? Brakuje mojej wiedzy na temat obsługi języka JavaScript w różnych przeglądarkach dla utf-8.
EDYCJA: Chciałem wyjaśnić, że moim głównym problemem związanym z kodowaniem wyników jest tak naprawdę obsługa wyników przez przeglądarkę. Z tego, co przeczytałem, wynika, że przeglądarki mogą być wrażliwe na kodowanie, szczególnie podczas korzystania z JSONP. Nie znalazłem żadnych naprawdę dobrych informacji na ten temat, więc muszę zacząć robić testy, aby zobaczyć, co się stanie. Idealnie chciałbym uciec tylko od tych kilku znaków, które są wymagane i tylko kodować wyniki utf-8.
źródło
Miałem tam problem. Kiedy koduję ciąg znaków w formacie JSON ze znakiem takim jak „é”, wszystkie przeglądarki zwracają to samo „é”, z wyjątkiem IE, który zwróci „\ u00e9”.
Następnie z PHP json_decode (), nie powiedzie się, jeśli znajdzie "é", więc dla Firefox, Opera, Safari i Chrome, muszę wywołać utf8_encode () przed json_decode ().
Uwaga: w moich testach IE i Firefox używają swojego natywnego obiektu JSON, inne przeglądarki używają json2.js.
źródło
utf8_encode()
, php.net/manual/en/function.utf8-encode.phpASCII już w nim nie ma. Używanie kodowania UTF-8 oznacza, że nie używasz kodowania ASCII. Mechanizm ucieczki powinien służyć do tego, co mówi RFC:
źródło
Miałem ten sam problem. Mi to pasuje. Proszę to sprawdzić.
json_encode($array,JSON_UNESCAPED_UNICODE);
źródło
FYI, RFC 4627 nie jest już oficjalną specyfikacją JSON. Został przestarzały w 2014 r. Przez RFC 7159 , który następnie został przestarzały w 2017 r. Przez RFC 8259 , który jest obecną specyfikacją.
RFC 8259 stwierdza:
źródło
Miałem podobny problem z é char ... Myślę, że komentarz „możliwe, że tekst, który podajesz, nie jest UTF-8” jest prawdopodobnie bliski znaku. Mam wrażenie, że domyślne sortowanie w mojej instancji było czymś innym, dopóki nie zdałem sobie sprawy i nie zmieniłem na utf8 ... Problem polega na tym, że dane już tam były, więc nie jestem pewien, czy przekonwertował dane, czy nie, kiedy je zmieniłem, wyświetla się dobrze w mysql stoł warsztatowy. Wynik końcowy jest taki, że php nie zakoduje danych w formacie json, po prostu zwróci false. Nie ma znaczenia, jakiej przeglądarki używasz jako serwera powodującego mój problem, php nie przeanalizuje danych do utf8, jeśli ten znak jest obecny. Jak mówię, nie jestem pewien, czy jest to spowodowane konwersją schematu do utf8 po danych, czy po prostu błędem php. W tym przypadku użyj
json_encode(utf8_encode($string));
źródło