2010-03-29 111 views
5

我刚刚创建了我的第一个jQuery函数与实际工作的jQuery,但不幸的是字符编码(ä,ö,ü,ß,č,ć,å ,ø)是一场噩梦。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: “应用程序/ X WWW的窗体-urlencoded;字符集= UTF-8” 和我试图包裹受影响的数据在encodeURIComponent()中,其中没有一个工作。

当我使用AJAX与ヶ辆()在我的PHP,我变音符号看起来像这样以纯文本格式: UE A,AE A,OE中,UE那张,AE澶,OEØ

而像这样在数据库: UE与Atilde;œ,AEÓOE和Atilde ;, UE与Atilde;¼,AEÃ&CURREN ;, OEØ

如果我不使用ヶ辆()而是使用mysql_real_escape_string()代替(或两者都不),但它们在纯文本中看起来不错,但它们在数据库中看起来很像: AEÃ,OEÃ,UEÃ,ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ

我一直在尝试大量的选项数小时,但我找不到可行的解决方案。到目前为止,我似乎拥有的唯一选择是让它们看起来像数据库中的一团糟,但如果需要编辑这些数据集,那将是非常不合适的。编码URL-

+1

您最后的观察结果是否表明问题可能与数据库(也可能是PHP)而不是jQuery和AJAX有关? – 2010-03-29 15:32:48

+0

我试过改变我的数据库编码为latin1,但没有区别 – rayne 2010-03-29 15:41:05

回答

6

我试着来包装encodeURIComponent方法()

罗受影响的数据,如果你传递一个{}对象,jQuery将照顾UTF-8和其为你。

当我使用AJAX与ヶ辆()在我的PHP,我变音符号看起来像这样以纯文本格式:UE A,AE A,OE中,UE那张,AE澶,OEØ

如果必须使用htmlentities(),你必须告诉它你的编码是可选的$charset参数UTF-8,否则会(愚蠢),默认为治疗你的所有字节为ISO-8859-1,并将它们编码为不当实体引用,每个字节一个。

更好的办法是使用htmlspecialchars(),因为它不会尝试将不必要的编码应用于真正需要它的几个ASCII字符以外的字符。

而且这样的数据库:UE AOE,AE A“,OE A-,UE那张,AE澶,OEØ

你是如何确定的?你用来从数据库中获取数据的工具是否知道Unicode? (如果它是一个狡猾的PHP web管理界面,也许不是.PHP在Unicode上并不是很好)。

您可能在数据库中存储了正确的UTF-8字节,但是在标记为具有拉丁语-1整理。这将起作用,就像你输入相同的字节一样多,但是如果MySQL不知道它们是UTF-8字节,那么在ASCII范围之外不区分大小写的字符串比较将无法正常工作,所以寻找Ä将不匹配ä。这对你而言可能并不重要。

如果我不使用ヶ辆(),但mysql_real_escape_string()代替

哇,小心。 HTML转义是用于页面的输出阶段。创建SQL查询时发生SQL字符串字面转义。你们都需要它们,但是不要混淆它们,或者尝试在同一个阶段做它们,否则你会有各种奇怪的逃跑 - 错误的和潜在的漏洞。

+0

当我使用htmlspecialchars()时,字符在网站上看起来不错,但是在数据库中这样:ü(不管数据库是UTF-8还是LATIN1)。我使用SQLyog来访问数据库,我没有像phpmyadmin这样的web界面。当我使用自定义的管理界面编辑它们时,它们也显得杂乱无章。 – rayne 2010-03-30 08:34:56

+0

好吧,SQLyog *声称*支持Unicode,所以希望它应该是正确的。如果数据看起来很重要,那么在使用数据库之前,您需要使用CREATE TABLE ... CHARACTER SET utf8来创建表并从PHP调用mysql_set_charset('utf8')'连接。 – bobince 2010-03-30 10:37:30

3

听起来好像在将数据插入数据库时​​发生问题。你在使用MySQL吗?连接到数据库服务器发出查询后:

SET NAMES utf8; 

这会告诉客户端连接希望在UTF-8发送数据,并把它解释为这样的数据库服务器。

此外,发送这个数据到浏览器时,一定要设置ContentType标头

header('Content-type: text/html; charset=utf-8'); 

这将告诉浏览器来解释数据为UTF-8。

1

尝试使用此功能,而不是ヶ辆

htmlspecialchars()

0

我终于发现,我工作的解决方案;我删除contentType: "application/x-www-form-urlencoded;charset=UTF-8"从我的jQuery AJAX,我只使用htmlentities($value, ENT_NOQUOTES, 'UTF-8');用SQL处理数据,我的数据库设置为utf8 unicode。

字符显示正确,在数据库中存储为ä

+0

请不要将HTML编码的数据存储在数据库中! HTML转义是一种输出问题,应该始终发生并且只在页面输出阶段发生。它不属于数据访问层。如果将HTML编码的数据放入数据库中,您将无法执行像LIKE'%uml%'这样的搜索(它无法区分编码变音符号和文本“uml”) ,每个'SUBSTRING'操作(包括由于字段长度限制引起的隐式修剪)都有可能破坏实体引用并生成破碎的HTML,并且会扰乱表格数据的任何非HTML使用,例如发送邮件。 – bobince 2010-03-30 10:43:02

+0

真的吗?我不知道,但我一般是一个糟糕的程序员;) 当我从我的脚本中删除htmlentities()时,我的特殊字符看起来像这样在数据库中: 奇怪的是,当我发送数据只通过PHP(当停用javascript时),它们在数据库中看起来很好(ä)。所以这个问题很可能是由jQuery ajax引起的。 – rayne 2010-03-30 12:41:14