我刚刚用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Ã,oe o
如果我不使用htmlentities()而不使用MysqL_real_escape_string()(或两者都没有),它们在纯文本中看起来很好,但它们在数据库中看起来像这样:
AEÓ,OEÃ-,UEÃ,aeÃouÃÃÃü
我现在已经尝试了几个小时的选择,但我找不到有效的解决方案.到目前为止,我似乎唯一的选择是让它们看起来像数据库中的混乱,但如果需要编辑这些数据集,那将是非常不利的.
I’ve tried to wrap the affected data in encodeURIComponent()
不,如果你传入一个{}对象,jQuery会为你处理UTF-8和URL编码.
When I use that AJAX with htmlentities() in my PHP,my umlauts look like this in plain text: UE �,AE �,OE �,ue ü,ae ä,oe o
如果你必须使用htmlentities(),你必须在可选的$charset参数中告诉它你的编码是UTF-8,否则它将(愚蠢地)默认将你的所有字节都视为ISO-8859-1,并将它们编码为不合适的实体引用,每个字节一个.
更好的是使用htmlspecialchars(),因为它不会尝试将不必要的编码应用于除了真正需要它的几个ASCII字符之外的字符.
And like this in the database: UE Ü,AE Ä,OE Ö,oe o
你是如何确定的?您用来从数据库中获取数据的工具是否了解Unicode? (如果它是一个狡猾的PHP Web管理界面,也许不是.PHP在Unicode上并不出色.)
您可能在数据库中存储了正确的UTF-8字节,但是在标记为具有Latin-1排序规则的表中.这将是有效的,因为你将获得相同的字节输出,但如果MysqL不知道它们是UTF-8字节,那么ASCII范围之外的不区分大小写的字符串比较将无法正常工作,所以寻找Ä不符合ä.这对你来说可能或不重要.
If I don’t use htmlentities() but MysqL_real_escape_string() instead
哇,小心. HTML-escaping用于页面的输出阶段.创建SQL查询时发生sql-string-literal-escaping.你需要他们两个,但不要混淆他们或尝试在同一阶段做他们,或者你会有各种奇怪的逃脱 – 错误和潜在的漏洞.