带有ajax请求和特殊字符的latin1 / unicode转换问题

时间:2010-05-05 10:29:46

标签: php unicode utf-8 character-encoding latin1

服务器是PHP5,HTML字符集是latin1(iso-8859-1)。对于常规表单POST请求,例如 em dash ( - )等“特殊”字符没有问题。虽然我不确定,但它确实有效。可能是因为在char代码150处存在一个可表示的字符串(这是我在服务器上的PHP中看到的ord字面文字。)

现在我们的应用程序还通过ajax提供了某种预览机制:将文本发送到服务器并发送完整的预览HTML。但是,通过ajax(使用GET和POST测试)发送的普通字符代码150 em破折号字符变异为更多:%E2%80%93。我已经在apache日志中看到了这一点。

根据我发现的各种来源,例如http://www.tachyonsoft.com/uc0020.htm,这是em dash的UTF8字节表示,我目前的知识是JavaScript处理Unicode中的所有内容。

但是在我的应用程序中,我需要latin1中的所有内容。简单地说:就像一个普通的POST请求会给我那个em dash作为char代码150,我也需要那个翻译的UTF8表示。

那是因为我失败了,因为当我尝试使用utf8_decode(...)iconv('UTF-8', 'iso-8859-1', ...)解码时,服务器上有PHP,但在这两种情况下我都会得到一个代表这个的常规?字符(和iconv也会引发通知:在输入字符串中检测到非法字符)。

我的目标是找到一个自动化的解决方案,但也许我想在这种情况下成为überclever?

我发现其他人只是用预定义的输入/输出设置进行手动替换;但这总会给我一种我可以松散角色的感觉。

细心的读者会注意到,我在理解关于Unicode和字符转换的全部影响/复杂性方面落后,我绝对更愿意将整个事物理解为简单的手动映射。

根据Delands关于单字节字符必要性的问题进行更新:

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

  1. 客户端latin1 - >正常的帖子请求 - >服务器上的latin1,发送回latin1中的完整页面,字符确定

  2. 客户端latin1 - > ajax请求(获取或发布) - > latin1转换为utf8 - >我尝试将utf8转换回latin1 - >将latin1 HTML片段发送到客户端以显示内联 - >特殊字符失败

  3. 第二种方式失败,因为来自utf8-> latin1的转换不能像上面描述的那样使用utf8_decode / icon。

    我的最终目标是简单地呈现用户输入的数据的预览。我需要服务器往返进行HTML呈现和其他必须完成的数据评估。

    解决方案

    Alans答案是解决方案:latin1在后​​面被视为windows-1252,这也是Word(至少我的2007年)似乎在复制和粘贴它与它之间的东西时所使用的浏览器。

    进一步有趣的链接(来自Alans维基百科文章)是HTML 5 Syntax

      

    8.2.2.2:用户代理必须至少支持UTF-8和Windows-1252编码,但可能支持更多。

    ...

      

    当用户代理以其他方式使用下表第一列中给出的编码将内容转换为Unicode字符或将Unicode字符转换为字节时,它必须使用第二列中单元格中给出的编码。同一排。当由于这种编码别名而对字节或字节序列的处理方式不同时,据说它的兼容性被误解了。

    ...

      

    输入编码: ISO-8859-1 - >替换编码: windows-1252

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

包含UTF-8如何工作指南的页面:

http://azabani.com/15

https://en.wikipedia.org/wiki/UTF-8

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