服务器是 PHP5,HTML 字符集是 latin1 (iso-8859-1)。对于常规形式的 POST 请求,“特殊”字符(例如破折号(–))没有问题。虽然我不确定,但它确实有效。可能是因为在字符代码 150 处存在浏览器的可表示字符(这是我在服务器上的 PHP 中看到的文字 em 破折号ord
)。
现在,我们的应用程序还通过 ajax 提供了某种预览机制:将文本发送到服务器,并发送回用于预览的完整 HTML。但是,通过 ajax 发送的普通字符代码 150 em 破折号字符(使用 GET 和 POST 测试)会变异为更多内容:%E2%80%93
. 我已经在 apache 日志中看到了这一点。
根据我找到的各种来源,例如http://www.tachyonsoft.com/uc0020.htm,这是 em dash 的 UTF8 字节表示,我目前的知识是 JavaScript 处理 Unicode 中的所有内容。
但是在我的应用程序中,我需要 latin1 中的所有内容。简单地说:就像一个常规的 POST 请求会给我那个破折号作为字符代码 150,我也需要它来翻译 UTF8 表示。
那是我失败了,因为当我尝试使用服务器上的 PHP 进行解码时,utf8_decode(...)
或者iconv('UTF-8', 'iso-8859-1', ...)
在这两种情况下,我都会得到一个表示该字符的常规?
字符(并且 iconv 也会向我发出通知:Detected an invalid character in input string ) .
我的目标是找到一个自动化的解决方案,但也许在这种情况下我想变得更加聪明?
我发现其他人只是用预定义的输入/输出集进行手动替换;但这总是让我觉得我可以放松角色。
细心的读者会注意到,我在理解关于 Unicode 和字符转换的事情的全部影响/复杂性方面落后了,我绝对更喜欢将事情作为一个整体来理解,而不是简单的手动映射。
基于关于单字节字符必要性的 Delands 问题的更新:
事实是,我不知道我是否需要它。目前,我有两种方法将数据传递到服务器并返回:
客户端 latin1 -> 正常发布请求 -> 服务器上的 latin1,以 latin1 发回完整页面,字符正常
客户端 latin1 -> ajax 请求(获取或发布)-> latin1 转换为 utf8 -> 我尝试将 utf8 转换回 latin1 -> 将 latin1 HTML 片段发送到客户端以内联显示 -> 特殊字符失败
第二种方法失败,因为从 utf8->latin1 的转换不能像上面描述的那样使用 utf8_decode/icon 进行。
我的最终目标只是呈现用户输入的数据的预览。我需要服务器往返以进行 HTML 渲染和其他必须完成的数据评估。
解决方案
艾伦的答案是解决方案:latin1
被视为windows-1252
在后面,这也是 Word(至少是我的 2007 年)在它和浏览器之间复制和粘贴内容时似乎使用的。
更有趣的链接(来自 Alans 维基百科文章)是HTML 5 Syntax:
8.2.2.2:用户代理必须至少支持 UTF-8 和 Windows-1252 编码,但可能支持更多。
...
当用户代理使用下表第一列中给定的编码将内容转换为 Unicode 字符或将 Unicode 字符转换为字节时,它必须改为使用同一行第二列中的单元格中给出的编码. 当一个字节或字节序列由于这种编码别名而被不同地对待时,据说它已被误解为兼容性。
...
输入编码:ISO-8859-1 -> 替换编码:windows-1252