jQuery: умляуты Ajax и специальные символы являются путаницей

Я только что создал свою первую функцию ajax с jQuery, который на самом деле работает, но к сожалению кодировка символов (для символов как ä, ö, ü, ß, č, ć, å, ø) является кошмаром.

Мои файлы и моя база данных являются всем UTF-8. Я попробовал множество опций в функции ajax и функции PHP, ни одна из которых не была удовлетворительной.

Это - мой ajax

var dataString = {
 'name': name,
 'mail': mail
 // other stuff
}


    $.ajax({
type: "POST",
url: "/post.php",
data: dataString,
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
cache: false,
success: function(html){
 // do stuff
}

Я попробовал его без contentType: "application/x-www-form-urlencoded; charset=UTF-8" и я попытался перенести затронутые данные в encodeURIComponent (), ни один из который работавший.

Когда я использую тот Ajax с htmlentities () в моем php, мои умляуты похожи на это в простом тексте: UE Ã�, AE Ã�, OE Ã�, ue ü, один ä, oe o

И как это в базе данных: UE Ãœ, AE à „, OE Ö, ue ü, один ä, oe o

Если я не использую htmlentities (), но mysql_real_escape_string () вместо этого (или ни один), они выглядят хорошими в простом тексте, но они похожи на это в базе данных: AE à „, OE Ö, UE Ãœ, один ä oe à ¶ ue ü

Я пробовал тонны опций в течение многих часов теперь, но я не могу найти решение, которое работает. До сих пор единственная опция, которую я, кажется, имею, сделала, чтобы они были похожи на общую путаницу в базе данных, но это было бы очень contraproductive, если те наборы данных должны быть отредактированы.

5
задан rayne 29 March 2010 в 15:29
поделиться

4 ответа

Я наконец нашел решение, которое мне подходит; Я удалил contentType: "application / x-www-form-urlencoded; charset = UTF-8" из моего jQuery ajax, я использую только htmlentities ($ value, ENT_NOQUOTES, 'UTF-8'); для обработки данных с помощью SQL, и моя база данных настроена на utf8 unicode.

Символы отображаются правильно и сохраняются как ä для ä и так далее в базе данных.

0
ответ дан 13 December 2019 в 22:05
поделиться

Попробуйте использовать это function вместо htmlentities

htmlspecialchars ()

1
ответ дан 13 December 2019 в 22:05
поделиться

Я пытался обернуть затронутые данные в encodeURIComponent ()

Нет, если вы передаете {} , jQuery позаботится о UTF-8 и кодировании URL за вас.

Когда я использую этот AJAX с htmlentities () в моем php, мои умляуты в текстовом виде выглядят следующим образом: UE Ã�, AE Ã�, OE Ã�, ue ü, ae ä, oe o

Если вы должны использовать htmlentities () , вы должны указать ему, что ваша кодировка - UTF-8 в необязательном аргументе $ charset , иначе он будет (глупо) по умолчанию обрабатывать все ваши байты как ISO-8859-1 и кодировать их в несоответствующие ссылки на объекты, по одной для каждого байта.

Лучше использовать вместо него htmlspecialchars () , поскольку он не пытается применить ненужную кодировку к символам, кроме нескольких символов ASCII, которые действительно в ней нуждаются.

И вот так в базе данных: UE Ãœ, AE à „, OE Ö, ue ü, ae ä, oe o

Как вы это определяете? Знает ли инструмент, который вы используете для извлечения данных из базы данных, о Unicode? (Если это изворотливый интерфейс веб-администратора PHP, может быть, и нет. PHP не очень хорош в Unicode.)

Возможно, вы храните правильные байты UTF-8 в базе данных, но в таблицах, отмеченных как имеющие латинский -1 подборка. Это будет работать, поскольку вы получите те же байты, что и вставили, но если MySQL не знает, что это байты UTF-8, то сравнения строк вне диапазона ASCII без учета регистра не будут работать правильно. , поэтому поиск Ä не будет соответствовать ä . Это может иметь для вас значение, а может и не иметь.

Если я использую не htmlentities (), а mysql_real_escape_string ()

Ого, осторожно. HTML-экранирование предназначено для вывода на страницу. При создании запроса SQL происходит экранирование строкового литерала SQL. Вам нужны они оба, но не смешивайте их и не пытайтесь делать их на одном этапе, иначе у вас будут все виды странных неудачных побегов и потенциальных уязвимостей.

6
ответ дан 13 December 2019 в 22:05
поделиться

Похоже, проблема возникает при вставке данных в базу данных. Вы используете MySQL? После подключения к серверу базы данных выполните запрос:

SET NAMES utf8;

Это сообщит серверу базы данных, что клиентское соединение желает отправлять данные в UTF-8 и интерпретировать их как таковые.

Кроме того, при отправке этих данных в браузер не забудьте установить заголовок ContentType

header('Content-type: text/html; charset=utf-8');

Это укажет браузеру интерпретировать данные как UTF-8.

3
ответ дан 13 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: