jQuery:AJAX变音符号&特殊人物是一团糟

时间:2010-03-29 15:23:00

标签: jquery character-encoding

我刚刚使用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ÃÃÃü

我现在已经尝试了几个小时的选项,但我找不到有效的解决方案。到目前为止,我似乎唯一的选择是让它们看起来像数据库中的混乱,但如果需要编辑这些数据集,这将是非常不利的。

4 个答案:

答案 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范围之外的不区分大小写的字符串比较将无法正常工作,因此查找Ä将与ä不匹配。这对你来说可能有关,也可能没有关系。

  

如果我不使用htmlentities()而是使用mysql_real_escape_string()

哎呀,小心点。 HTML-escaping用于页面的输出阶段。创建SQL查询时发生SQL-string-literal-escaping。你需要它们,但不要混淆它们或者试图在同一个阶段进行它们,否则你将会遇到各种奇怪的逃脱 - 错误和潜在的漏洞。

答案 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。

字符显示正确,并以ä形式存储在数据库中,等等。