Я только что создал свою первую функцию 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, если те наборы данных должны быть отредактированы.
Я наконец нашел решение, которое мне подходит; Я удалил contentType: "application / x-www-form-urlencoded; charset = UTF-8"
из моего jQuery ajax, я использую только htmlentities ($ value, ENT_NOQUOTES, 'UTF-8');
для обработки данных с помощью SQL, и моя база данных настроена на utf8 unicode.
Символы отображаются правильно и сохраняются как ä
для ä и так далее в базе данных.
Попробуйте использовать это function вместо htmlentities
htmlspecialchars ()
Я пытался обернуть затронутые данные в 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. Вам нужны они оба, но не смешивайте их и не пытайтесь делать их на одном этапе, иначе у вас будут все виды странных неудачных побегов и потенциальных уязвимостей.
Похоже, проблема возникает при вставке данных в базу данных. Вы используете MySQL? После подключения к серверу базы данных выполните запрос:
SET NAMES utf8;
Это сообщит серверу базы данных, что клиентское соединение желает отправлять данные в UTF-8 и интерпретировать их как таковые.
Кроме того, при отправке этих данных в браузер не забудьте установить заголовок ContentType
header('Content-type: text/html; charset=utf-8');
Это укажет браузеру интерпретировать данные как UTF-8.