服务器是PHP5和HTML charset是latin1(iso-8859-1)。对于常规形式的POST请求,例如,( - )这样的“特殊”字符没有问题,例如。虽然我不确定,但它的工作原理。可能是因为在代码为150的浏览器中存在一个可表示的字符(这是我在服务器上看到的与ord
相似的文字)。latin1/aicax请求和特殊字符的unicode转换问题
现在我们的应用程序还通过ajax提供了一些预览机制:文本发送到服务器,并发送预览的完整HTML。然而,当通过ajax发送(用GET和POST测试)时,普通字符代码150 em破折号字符变为更多:%E2%80%93
。我已经在apache日志中看到了这一点。
根据我发现的各种来源,例如http://www.tachyonsoft.com/uc0020.htm,这是em破折号的UTF8字节表示,我目前的知识是JavaScript处理Unicode中的所有内容。
但是在我的应用程序中,我需要latin1中的所有内容。简单地说:就像一个普通的POST请求会给我那个破折号作为字符代码150一样,我也会需要它来表示翻译的UTF8表示。
这是我失败了,因为PHP的服务器上,当我尝试将其与任何utf8_decode(...)
或iconv('UTF-8', 'iso-8859-1', ...)
但在这两种情况下,我得到代表这个角色经常?
(和iconv也抛出我的通知解码:检测输入字符串中的非法字符)。
我的目标是找到一个自动化的解决方案,但也许我试图在这种情况下是überclever?
我发现其他人只是用预定义的输入/输出集进行手动替换;但那总会让我感觉我可以放松角色。
敏锐的读者会注意到,我在理解关于Unicode和字符转换的全部影响/复杂性方面落后于我,我绝对更愿意理解整个事物,然后简单地手动映射。基于对单字节字符必要性Delands问题
更新:
事实是,我不知道我是否需要它。目前,我有两种方式将数据传递给服务器,并取回:
客户端处理latin1 - >正常POST请求 - > latin1的服务器上,发回完整的页面Latin1的字符OK
客户端latin1 - > ajax请求(get或post) - > latin1转换为utf8 - >我尝试将utf8转换回latin1 - >将latin1 HTML片段发送给客户端以显示内联 - >特殊字符失败
第二种方法失败,因为从utf8-> latin1转换没有像上面描述的那样使用utf8_decode /图标工作。
我的最终目标仅仅是呈现用户输入的数据预览。我需要服务器往返的HTML渲染和其他数据评估必须完成。
解决方案
阿兰的回答是解决方案:latin1
被作为在后面windows-1252
处理,这也是该用什么词(至少是我2007年在这里)似乎使用时之间复制&粘贴的东西,浏览器。
而且有趣的链接(从阿兰维基百科文章)是对HTML 5 Syntax:
8.2.2.2:用户代理必须至少支持UTF-8和Windows-1252编码,但可以支持更多。
...
当用户代理会以其他方式使用在下面表的第一列中给出的编码要么转换内容Unicode字符或转换Unicode字符为字节,就必须代替使用同一行第二列单元格中给出的编码。当一个字节或字节序列由于这种编码别名而被不同地处理时,据说它被误解为兼容性。
...
输入编码:ISO-8859-1 - >替换编码:窗口1252
就是这样。成功的关键是要知道latin1默默地被视为windows-1252。你摇滚,谢谢。 – mark 2010-05-06 14:08:36