2010-05-05 47 views
1

服务器是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问题

更新:

事实是,我不知道我是否需要。目前,我有两种方式将数据传递给服务器,并取回:

  1. 客户端处理latin1 - >正常POST请求 - > latin1的服务器上,发回完整的页面Latin1的字符OK

  2. 客户端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

回答

3

ISO-8859-1不支持em-dash字符。您实际上正在使用微软扩展代码页之一,可能是windows-1252。它实际上是latin1的超集,所以浏览器倾向于在页面被作为ISO-8859-1(这就是为什么你的字符正确显示)的时候使用它。但是,如果您要使用扩展字符(如em-dash),则应尽可能指定windows-1252作为字符集。或者,更好的是,在任何地方都指定UTF-8。

+0

就是这样。成功的关键是要知道latin1默默地被视为windows-1252。你摇滚,谢谢。 – mark 2010-05-06 14:08:36

1

页关于如何UTF-8部作品指南:

http://azabani.com/15

http://wikipedia.org/wiki/UTF-8

简单地说,不存在的“扩展”的ASCII集像ISO-8859-1(其在255个点限制)和Unicode(拥有1114112个代码点,其中超过10万是一个简单的映射用过的)。请详细说明为什么单字节字符集是需要;也许我可以帮你解决这个限制。 UTF-8是编码文本的最有效和灵活的选择,应尽可能使用UTF-8。

+0

感谢您的博客条目,非常丰富的组成/分解字符。 我已经更新了关于您关于单字节转换的查询的问题。 – mark 2010-05-06 10:31:38