【问题】
折腾:
【记录】给Wordpress网站crifan.org中文章下方添加捐赠按钮
期间,点击美元图标,打开PayPal捐赠页面,结果出错:
数据与输入的字符集或默认编码不符。如需更多信息,请联系商家。 返回到xxx@163.com目前我们无法处理您的申请。请返回xxx@163.com,并尝试其他选项。 |
如图:
【解决过程】
1.回去仔细观察,看到个现象:
很明显,其中链接地址是不正常的:
即item_name中的值,显示异常。
看来是:
对于当时用Python去quote地址的时候,估计是弄成了本地编码GBK的encode了,而不是UTF-8?
搞得是乱码了。所以人家PayPal不认是正常的。
2.所以回去看看,结果Python中对于urllib的quote的解释是:
|
没有看到的,以为可以添加字符编码类型的参数。
3.所以另外想办法去encode地址,搜:
url encode
找到:
UrlEncode编码/UrlDecode解码 – 站长工具
得到:
Crifan+Li%26%2339%3bs+Blog%3a+crifan.org
和之前Python的urllib.quote出来的:
Crifan%20Li%27s%20Blog%3A%20crifan.org
很明显是不一样的
4.所以去试试这个:
Crifan+Li%26%2339%3bs+Blog%3a+crifan.org
(如果不行,再手动把(空格被编码后变成的)+换成%20)
即,之前的地址从:
<strong><font color="red">捐赠(Donate):</font></strong> <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_rmb_48x48.png" title="给Crifan捐赠人民币" alt="通过支付宝捐赠人民币" style="border:none;vertical-align:middle;" /></a> | <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=green-waste@163.com&currency_code=USD&amount=1&item_name=Crifan%20Li%27s%20Blog%3A%20crifan.org&undefined_quantity=1" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_dollar_48x48.png" alt="Donate dollar via paypal" title="Donate dollar to Crifan" style="border:none;vertical-align:middle;" /></a>
变为:
<strong><font color="red">捐赠(Donate):</font></strong> <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_rmb_48x48.png" title="给Crifan捐赠人民币" alt="通过支付宝捐赠人民币" style="border:none;vertical-align:middle;" /></a> | <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=green-waste@163.com&currency_code=USD&amount=1&item_name=Crifan+Li%26%2339%3bs+Blog%3a+crifan.org&undefined_quantity=1" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_dollar_48x48.png" alt="Donate dollar via paypal" title="Donate dollar to Crifan" style="border:none;vertical-align:middle;" /></a>
结果是:
可见,新的地址,也不太对,至少中间不该有那个39 0字样的。
5.然后重新换个别的:
http://www.gongju.com/urlencode/
去编码,得到结果是:
和Python得到的基本一样,除了空格变成+了。
然后对照人家阮一峰的:
Ruan%20YiFeng%27s%20Blog
其实可以确认:
此处的:
Crifan%20Li%27s%20Blog%3A%20crifan.org
应该就是对的,不应该错的。
但是需要找到,为何不知道哪里多出来个:
在路上
这三个中文。。
6.重新试试:
<strong><font color="red">捐赠(Donate):</font></strong> <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_rmb_48x48.png" title="给Crifan捐赠人民币" alt="通过支付宝捐赠人民币" style="border:none;vertical-align:middle;" /></a> | <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=green-waste@163.com&currency_code=USD&amount=1&item_name=Crifan%20Li%27s%20Blog%3A%20crifan.org&undefined_quantity=1" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_dollar_48x48.png" alt="Donate dollar via paypal" title="Donate dollar to Crifan" style="border:none;vertical-align:middle;" /></a>
效果是:
和之前一样,然后拷贝出来的url是:
https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=green-waste@163.com¤cy_code=USD&amount=1&item_name=Crifani%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E5%9C%A8%E8%B7%AF%E4%B8%8Alog%EF%BF%BDrifan.com&undefined_quantity=1
对比的看了下,才明白:
原来对于php代码:
/** Copyright Info */ function retina_post_copyright() { $output = ''; $cur_post_custom_keys = get_post_custom_keys(); if (($cur_post_custom_keys==null) || !in_array('copyright', $cur_post_custom_keys)){ $mine_info = sprintf( ' <div class="postcopyright"> <fieldset> <legend>防君子不防也无法防小人的声明</legend> 如未注明转载等字样则均为crifan原创。对于原创文章,转载请注明出处:<br /> <a href="%1$s" title="%2$s"><strong>%3$s - %4$s</strong></a><br /> 本文链接: <br /> <a target="_blank" href="%5$s" title="%6$s">%7$s</a> <br /> <hr /> <strong><font color="red">捐赠(Donate):</font></strong> <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_rmb_48x48.png" title="给Crifan捐赠人民币" alt="通过支付宝捐赠人民币" style="border:none;vertical-align:middle;" /></a> | <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=green-waste@163.com&currency_code=USD&amount=1&item_name=Crifan%20Li%27s%20Blog%3A%20crifan.org&undefined_quantity=1" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_dollar_48x48.png" alt="Donate dollar via paypal" title="Donate dollar to Crifan" style="border:none;vertical-align:middle;" /></a> </fieldset> </div>', get_bloginfo('siteurl'), get_bloginfo('name'), get_bloginfo('name'), get_bloginfo('description'), get_permalink(), the_title_attribute( 'echo=0' ), the_title_attribute( 'echo=0' )); $output = $mine_info; } else { $copyright_value = get_post_custom_values('copyright'); $other_info = sprintf( ' <div class="postcopyright"> <fieldset> <legend>转载声明</legend> 本文由crifan转载自:<br /> <a target="_blank" rel="nofollow" href="%1$s" >%2$s</a> <br /> 本文链接:<br /> <a href="%3$s" title="%4$s">%5$s</a> <br /> <hr /> <strong><font color="red">捐赠(Donate):</font></strong> <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_rmb_48x48.png" title="给Crifan捐赠人民币" alt="通过支付宝捐赠人民币" style="border:none;vertical-align:middle;" /></a> | <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=green-waste@163.com&currency_code=USD&amount=1&item_name=Crifan%20Li%27s%20Blog%3A%20crifan.org&undefined_quantity=1" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_dollar_48x48.png" alt="Donate dollar via paypal" title="Donate dollar to Crifan" style="border:none;vertical-align:middle;" /></a> </fieldset> </div>', $copyright_value[0], $copyright_value[0], get_permalink(), the_title_attribute( 'echo=0' ), the_title_attribute( 'echo=0' )); $output = $other_info; } return $output; }
此处,被编码后的,空格被换成了%20的:
Crifan%20Li%27s%20Blog%3A%20crifan.org
本来是没问题的,但是却由于放到了此处php函数中,导致%20被解析为第20个参数值了
(对应的,前面的%2$s,是title的值)
所以才出错的,由此得知:
此处,还是把空格换成+,就可以避免此问题了,所以去换为:
<strong><font color="red">捐赠(Donate):</font></strong> <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_rmb_48x48.png" title="给Crifan捐赠人民币" alt="通过支付宝捐赠人民币" style="border:none;vertical-align:middle;" /></a> | <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=green-waste@163.com&currency_code=USD&amount=1&item_name=Crifan+Li%27s+Blog%3A+crifan.org&undefined_quantity=1" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_dollar_48x48.png" alt="Donate dollar via paypal" title="Donate dollar to Crifan" style="border:none;vertical-align:middle;" /></a>
结果发现还是不行,因为其中还有单引号被编码后的%27呢。。。
所以,算了,打算去掉百分号,但是想到了:
估计php中,应该有办法输入%才对。估计是%%
然后通过:
搜:
php 函数 百分号
找到:
的:
说明参数 format 是转换的格式,以百分比符号 ("%") 开始到转换字符结束。下面的可能的 format 值:
|
而得知我的猜测是对的,
所以,此时:
无需把之前的%20变成+了,也可以能够保留%27了,而只需要把%变成%%即可:
<strong><font color="red">捐赠(Donate):</font></strong> <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_rmb_48x48.png" title="给Crifan捐赠人民币" alt="通过支付宝捐赠人民币" style="border:none;vertical-align:middle;" /></a> | <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=green-waste@163.com&currency_code=USD&amount=1&item_name=Crifan%%20Li%%27s%%20Blog%%3A%%20crifan.org&undefined_quantity=1" target="_blank"><img src="https://www.crifan.org/files/res/crifan_com/donate_icon_dollar_48x48.png" alt="Donate dollar via paypal" title="Donate dollar to Crifan" style="border:none;vertical-align:middle;" /></a>
然后去试试效果:
最终PayPal的地址终于正常了:
【总结】
问题:
自己把带空格和其他单引号等字符的字符串,通过encode编码后,结果会出现带%的,比如空格对应的%20和单引号对应的%27
然后把这样的内容,放到html中,其实是没问题,可以正常显示的;
但是由于此处的html是在php代码中,涉及到sprintf的
注:php的sprintf会通过%X去格式化字符串的
所以会错误的把%20和%27等内容去额外格式化,从而导致最终出来的html结果有问题。
解决办法就是:
对于在php的sprintf中的html,如果其中有%,则写成%%,即可避免此问题了。
转载请注明:在路上 » 【已解决】打开PayPal捐赠页面时出错:数据与输入的字符集或默认编码不符。如需更多信息,请联系商家。