(PHP) rawurlencode/decode 似乎将 '£' 符号编码为 '£' (%C2%A3 而不是 %A3)

Posted

技术标签:

【中文标题】(PHP) rawurlencode/decode 似乎将 \'£\' 符号编码为 \'£\' (%C2%A3 而不是 %A3)【英文标题】:(PHP) rawurlencode/decode seems to encode '£' sign as '£' (%C2%A3 instead of %A3)(PHP) rawurlencode/decode 似乎将 '£' 符号编码为 '£' (%C2%A3 而不是 %A3) 【发布时间】:2010-07-13 13:01:43 【问题描述】:

所以,我遇到了 php 的 rawurlencode 函数的问题。我们网络应用程序中的所有文本字段在被网络服务器处理之前当然都经过转换,我们为此使用了 rawurlencode。这几乎适用于我发现的每个字符,除了“£”符号。现在,我们的用户没有理由输入井号,但他们可能会,所以我想解决这个问题。

问题在于 rawurlencode 不会将网页上输入的井号编码为 %A3,而是编码为 %C2%A3。更糟糕的是,如果用户未能输入另一位关键信息(这会导致网页刷新 - 检查在后端完成 - 并尝试使用用户使用过的信息重新填写表单框),那么当%C2 通过 rawurldecode/encode 运行,它变成 Ã? - 又名,%C3?。当然,“£”也变成了另一个£!

那么,是什么原因造成的呢?我认为这是一个字符编码问题,但我对这些事情并不了解。我在某处听说我可以手动将 £s 编码为 &pound,但是当数据库可以处理“£”并且磅符号有百分比编码时,我为什么需要这样做?这是 rawurlencode 的 bug,还是字符集不同导致的 bug?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

标准要求表单以您在<form accept-charset="..."> 中指定的字符编码提交,如果未指定或用户输入的文本无法以您指定的字符集表示,则为 UTF-8。

很明显,您收到的是 UTF-8 编码的井号。如果要将其转换为 ISO-8859-15,请编写:

iconv("UTF-8", "ISO-8859-15//TRANSLIT", $original)

【讨论】:

那么,哪个是更好的方法 - 更改表单的字符集 - 请注意我在 w3schools 上找到的属性是接受字符集,而不是字符集 - 还是在代码中使用 iconv?我读到 IE 显然不能与 accept-charset 一起正常工作,那么从 UTF 转换服务器端会更好吗? @Stephen 你说得对,它是“接受字符集”。我会说在服务器端做会更好,因为标准不能保证你无论如何都不会得到 UTF-8。更好的是,始终使用 UTF-8,包括在数据库中存储数据。 IMO,所有新的网络应用程序都应该朝着这个方向发展。 @Stephen 请注意,尽管这是标准,但也存在一些实现问题,特别是一些浏览器使用页面的编码来确定提交的编码,尽管存在“接受-字符集”。见***.com/questions/153527【参考方案2】:

这可能是将本机字符集中的 A3 字符编码为 UTF-8 编码的 C2A3,这似乎是 ANSI A3 的有效 UTF-8 编码。只需使用 UTF-8 编码 使用您的编码网址,或指定 ANSI 编码为 urlencode。

Artefacto 的回答代表了您需要转换字符编码的情况,例如,您正在显示一个页面并且页面编码设置为 Latin-1。 (原始)Urlencode 将生成具有多字节字符表示的转义字符串。 (Raw)Urldecode 将默认生成 utf-8 编码字符串,并将 £ 表示为两个字节。如果您显示此字符串并声称它是 ISO-8859 编码字符串,它将显示为两个字符。

PHP 和 UTF-8 入门:http://www.phpwact.org/php/i18n/utf-8 一些“热点提示”:http://www.sitepoint.com/blogs/2006/08/10/hot-php-utf-8-tips/

很可能,在从 rawurldecode 获取字符串和使用该字符串之间,区域设置被假定为 ISO8859,因此当两个字节表示一个字符时,它们会被解释为两个字符。

使用mb_convert_encoding 强制PHP 意识到字符串中的字节代表一个UTF-8 编码的字符串。

【讨论】:

有没有办法告诉 PHP 的 urlencode(或者更好的是 rawurlencode,因为 urlencode 已经过时)使用不同的 ANSI 编码?我没有在手册页上看到任何功能的方法。

以上是关于(PHP) rawurlencode/decode 似乎将 '£' 符号编码为 '£' (%C2%A3 而不是 %A3)的主要内容,如果未能解决你的问题,请参考以下文章

php [guzzle php] guzzle php #php

php send.php php邮件模板#php

IntelliJ IDEA 11编辑php是,支持php文件名为.php5和.php4,如何设置能让其也支持.php呢?

如何从php5升级到php7

请问php中如何调用php文件中的内容?

php [php:PHPMailer示例] php库“PHPMailer”示例。 #PHP