jQuery:AJAX变音符号和特殊字符很乱

ray*_*yne 5 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
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过没有contentType:"application/x-www-form-urlencoded; charset = UTF-8",我试图将受影响的数据包装在encodeURIComponent()中,但没有一个工作.

当我在我的php中使用带有htmlentities()的AJAX时,我的变音符号在纯文本中看起来像这样:UE×,AE×,OE×,ueü,aeÃ,o o

在数据库中像这样:UEÃ,AEÃ",OEÃ,ueü,aeÃ,o o o

如果我不使用htmlentities()而不使用mysql_real_escape_string()(或者两者都不使用),它们在纯文本中看起来很好,但它们在数据库中看起来像这样:AEÃ",OEÃ-,UEœ,aeäoe Ãuee

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

bob*_*nce 6

我试图将受影响的数据包装在encodeURIComponent()中

不,如果你传入一个{}对象,jQuery会为你处理UTF-8并对其进行URL编码.

当我在我的php中使用带有htmlentities()的AJAX时,我的变音符号在纯文本中看起来像这样:UE×,AE×,OE×,ueü,aeÃ,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.你需要他们两个,但不要混淆他们或尝试在同一阶段做他们,或者你会有各种奇怪的逃脱 - 错误和潜在的漏洞.