最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】打开PayPal捐赠页面时出错:数据与输入的字符集或默认编码不符。如需更多信息,请联系商家。

CharEncoding crifan 2579浏览 0评论

【问题】

折腾:

【记录】给Wordpress网站crifan.com中文章下方添加捐赠按钮

期间,点击美元图标,打开PayPal捐赠页面,结果出错:

数据与输入的字符集或默认编码不符。如需更多信息,请联系商家。

返回到[email protected]

目前我们无法处理您的申请。请返回[email protected],并尝试其他选项。

如图:

paypal page error return to seller for data input charset unmatch

 

【解决过程】

1.回去仔细观察,看到个现象:

when mouse hover show link abnormal in url

很明显,其中链接地址是不正常的:

即item_name中的值,显示异常。

看来是:

对于当时用Python去quote地址的时候,估计是弄成了本地编码GBK的encode了,而不是UTF-8?

搞得是乱码了。所以人家PayPal不认是正常的。

2.所以回去看看,结果Python中对于urllib的quote的解释是:

urllib.quote(string[, safe])

Replace special characters in string using the %xx escape. Letters, digits, and the characters '_.-' are never quoted. By default, this function is intended for quoting the path section of the URL. The optional safe parameter specifies additional characters that should not be quoted — its default value is '/'.

Example: quote('/~connolly/') yields '/%7econnolly/'.

没有看到的,以为可以添加字符编码类型的参数。

3.所以另外想办法去encode地址,搜:

url encode

找到:

UrlEncode编码/UrlDecode解码 – 站长工具

tools for web master input string choose default utf8 then encode

得到:

Crifan+Li%26%2339%3bs+Blog%3a+crifan.com

和之前Python的urllib.quote出来的:

Crifan%20Li%27s%20Blog%3A%20crifan.com

很明显是不一样的

4.所以去试试这个:

Crifan+Li%26%2339%3bs+Blog%3a+crifan.com

(如果不行,再手动把(空格被编码后变成的)+换成%20)

即,之前的地址从:

<strong><font color="red">捐赠(Donate):</font></strong>  <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.com/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&amp;[email protected]&amp;currency_code=USD&amp;amount=1&amp;item_name=Crifan%20Li%27s%20Blog%3A%20crifan.com&amp;undefined_quantity=1" target="_blank"><img src="https://www.crifan.com/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.com/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&amp;[email protected]&amp;currency_code=USD&amp;amount=1&amp;item_name=Crifan+Li%26%2339%3bs+Blog%3a+crifan.com&amp;undefined_quantity=1" target="_blank"><img src="https://www.crifan.com/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>

结果是:

new paypal link still not ok for 39 0

可见,新的地址,也不太对,至少中间不该有那个39 0字样的。

5.然后重新换个别的:

http://www.gongju.com/urlencode/

去编码,得到结果是:

use gongju to encode crifan string

 

和Python得到的基本一样,除了空格变成+了。

然后对照人家阮一峰的:

Ruan%20YiFeng%27s%20Blog

其实可以确认:

此处的:

Crifan%20Li%27s%20Blog%3A%20crifan.com

应该就是对的,不应该错的。

但是需要找到,为何不知道哪里多出来个:

在路上

这三个中文。。

6.重新试试:

<strong><font color="red">捐赠(Donate):</font></strong>  <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.com/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&amp;[email protected]&amp;currency_code=USD&amp;amount=1&amp;item_name=Crifan%20Li%27s%20Blog%3A%20crifan.com&amp;undefined_quantity=1" target="_blank"><img src="https://www.crifan.com/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&[email protected]&currency_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.com/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&amp;[email protected]&amp;currency_code=USD&amp;amount=1&amp;item_name=Crifan%20Li%27s%20Blog%3A%20crifan.com&amp;undefined_quantity=1" target="_blank"><img src="https://www.crifan.com/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.com/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&amp;[email protected]&amp;currency_code=USD&amp;amount=1&amp;item_name=Crifan%20Li%27s%20Blog%3A%20crifan.com&amp;undefined_quantity=1" target="_blank"><img src="https://www.crifan.com/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.com

本来是没问题的,但是却由于放到了此处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.com/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&amp;[email protected]&amp;currency_code=USD&amp;amount=1&amp;item_name=Crifan+Li%27s+Blog%3A+crifan.com&amp;undefined_quantity=1" target="_blank"><img src="https://www.crifan.com/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 函数 百分号

找到:

PHP fprintf() 函数

的:

说明

参数 format 是转换的格式,以百分比符号 ("%") 开始到转换字符结束。下面的可能的 format 值:

  • %% – 返回百分比符号
  • %b – 二进制数
  • %c – 依照 ASCII 值的字符
  • %d – 带符号十进制数
  • %e – 可续计数法(比如 1.5e+3)
  • %u – 无符号十进制数
  • %f – 浮点数(local settings aware)
  • %F – 浮点数(not local settings aware)
  • %o – 八进制数
  • %s – 字符串
  • %x – 十六进制数(小写字母)
  • %X – 十六进制数(大写字母)

而得知我的猜测是对的,

所以,此时:

无需把之前的%20变成+了,也可以能够保留%27了,而只需要把%变成%%即可:

<strong><font color="red">捐赠(Donate):</font></strong>  <a href="https://me.alipay.com/crifan" target="_blank"><img src="https://www.crifan.com/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&amp;[email protected]&amp;currency_code=USD&amp;amount=1&amp;item_name=Crifan%%20Li%%27s%%20Blog%%3A%%20crifan.com&amp;undefined_quantity=1" target="_blank"><img src="https://www.crifan.com/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的地址终于正常了:

finally the paypal link correct even after php sprintf

 

【总结】

问题:

自己把带空格和其他单引号等字符的字符串,通过encode编码后,结果会出现带%的,比如空格对应的%20和单引号对应的%27

然后把这样的内容,放到html中,其实是没问题,可以正常显示的;

但是由于此处的html是在php代码中,涉及到sprintf的

注:php的sprintf会通过%X去格式化字符串的

所以会错误的把%20和%27等内容去额外格式化,从而导致最终出来的html结果有问题。

解决办法就是:

对于在php的sprintf中的html,如果其中有%,则写成%%,即可避免此问题了。

转载请注明:在路上 » 【已解决】打开PayPal捐赠页面时出错:数据与输入的字符集或默认编码不符。如需更多信息,请联系商家。

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
88 queries in 0.176 seconds, using 22.11MB memory