我刚刚使用jQuery创建了我的第一个ajax函数,但是不幸的是字符编码(对于像ä,ö,ü,ß,č,ć,å,ø这样的字符)是一场噩梦。
我的文件和我的数据库都是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()中,但没有一个工作。
当我在我的php中使用带有htmlentities()的AJAX时,我的变音符号在纯文本中看起来像这样: UE×,AE×,OE×,ueü,aeä,oe o
在数据库中这样: UEœ,AEÓ,OEÃ,ueü,aeÃ,o o o
如果我不使用htmlentities()而不使用mysql_real_escape_string()(或者两者都不使用),它们在纯文本中看起来很好,但它们在数据库中看起来像这样: AEÓ,OEÃ-,UEÃ,, aeÃouÃÃÃü
我现在已经尝试了几个小时的选项,但我找不到有效的解决方案。到目前为止,我似乎唯一的选择是让它们看起来像数据库中的混乱,但如果需要编辑这些数据集,这将是非常不利的。
答案 0 :(得分:6)
我试图将受影响的数据包装在encodeURIComponent()
中
不,如果你传递了一个{}
对象,jQuery会为你处理UTF-8和URL编码。
当我在我的php中使用带有htmlentities()的AJAX时,我的变音符号在纯文本中看起来像这样:UE×,AE×,OE×,ueü,aeÃ,o o o
如果你必须使用htmlentities()
,你必须在可选的UTF-8
参数中告诉它你的编码是$charset
,否则它会(愚蠢地)默认将所有字节都视为ISO -8859-1,并将它们编码为不适当的实体引用,每个字节一个。
最好使用htmlspecialchars()
,因为它不会尝试将不必要的编码应用于真正需要它的少数ASCII字符以外的字符。
在数据库中就像这样:UEœ,AEÓ,OEÃ,ueü,aeÃ,o o o
你是如何确定的?您用来从数据库中获取数据的工具是否了解Unicode? (如果它是一个狡猾的PHP Web管理界面,也许不是.PHP在Unicode上并不出色。)
您可能在数据库中存储了正确的UTF-8字节,但是在标记为具有Latin-1排序规则的表中。这将是有效的,因为你将获得相同的字节输出,但如果MySQL不知道它们是UTF-8字节,那么ASCII范围之外的不区分大小写的字符串比较将无法正常工作,因此查找Ä
将与ä
不匹配。这对你来说可能有关,也可能没有关系。
哎呀,小心点。 HTML-escaping用于页面的输出阶段。创建SQL查询时发生SQL-string-literal-escaping。你需要它们,但不要混淆它们或者试图在同一个阶段进行它们,否则你将会遇到各种奇怪的逃脱 - 错误和潜在的漏洞。如果我不使用htmlentities()而是使用mysql_real_escape_string()
答案 1 :(得分:3)
听起来像将数据插入数据库时会出现问题。你在使用MySQL吗?连接到数据库服务器后,发出查询:
SET NAMES utf8;
这将告诉数据库服务器客户端连接希望以UTF-8发送数据并将其解释为。
此外,将此数据发送到浏览器时,请确保设置ContentType标头
header('Content-type: text/html; charset=utf-8');
这将告诉浏览器将数据解释为UTF-8。
答案 2 :(得分:1)
尝试使用此功能代替htmlentities
htmlspecialchars()
答案 3 :(得分:0)
我终于找到了适合我的解决方案;我从我的jQuery ajax中删除了 contentType: "application/x-www-form-urlencoded;charset=UTF-8"
,我只使用htmlentities($value, ENT_NOQUOTES, 'UTF-8');
来处理带有SQL的数据,而我的数据库设置为utf8 unicode。
字符显示正确,并以ä
形式存储在数据库中,等等。