2010-07-13 43 views
4

所以,我遇到了PHP的rawurlencode函数的问题。我们的网络应用程序中的所有文本字段在被网络服务器处理之前当然会被转换,并且我们已经使用了rawurlencode。对于我找到的几乎每个角色都适用,期望获得“£”符号。现在,我们的用户没有理由永远输入英镑符号,但他们可能会这么做,所以我想要照顾好这一点。(PHP)rawurlencode/decode似乎将'£'标记编码为''(%C2%A3而不是%A3)

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

那么,这是什么原因造成的?我认为这是一个字符编码问题,但我不知道这些事情。我听说某处我可以手动编码为&磅,但为什么我需要在数据库可以处理“英镑”时做这件事,并且英镑符号有百分比编码?这是rawurlencode中的错误,还是由不同字符集造成的错误?

感谢您的任何帮助。

回答

3

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

显然,您正在接收以UTF-8编码的井号。如果你想将其转换为ISO-8859-15,写:

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

因此,哪种方法更好 - 更改表单的字符集 - 请注意,我在w3schools上找到的属性是accept-charset,而不是字符集 - 或者在代码中使用iconv?我读到IE显然不能正确使用accept-charset,那么将服务器端转换为UTF更好吗? – Stephen 2010-07-13 13:30:55

+0

@Stephen你说得对,它是“接受字符集”。我认为最好在服务器端做,因为标准并不能保证你不会得到UTF-8。更好的是,始终使用UTF-8,包括将数据存储在数据库中。国际海事组织,所有新的Web应用程序都应朝着这个方向前进。 – Artefacto 2010-07-13 15:43:50

+0

@Stephen请注意,尽管这是标准,但仍有一些实现问题,特别是一些浏览器使用页面编码来确定提交的编码,尽管存在“accept-charset”。请参阅http://stackoverflow.com/questions/153527 – Artefacto 2010-07-13 15:53:08

2

这可能是编码A3字符在您的本地字符集中设置为C2A3的UTF-8编码,这似乎是ANSI A3的有效UTF-8编码。只需使用UTF-8编码 来使用您的编码url,或者指定一个ANSI编码为urlencode。

Artefacto的回答表示您需要转换字符编码的情况,例如,您正在显示页面并且页面编码设置为Latin-1。 (Raw)Urlencode将产生具有多字节字符表示的转义字符串。 (原始)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编码的字符串。

+1

有没有办法告诉PHP的进行urlencode(或更好,rawurlencode,因为用urlencode是过时)使用不同的不同ANSI编码?我没有看到任何功能的手册页上的方式。 – Stephen 2010-07-13 13:31:41