【问题标题】:PHP Url Encoding Not Encoding ProperlyPHP URL 编码未正确编码
【发布时间】:2013-11-16 17:21:10
【问题描述】:

我正在尝试对以下字符串进行编码:Peôn

根据:http://meyerweb.com/eric/tools/dencoder/,字符串应该编码为:Pe%C3%B4n

当我使用urlencode($name) 时,我得到Pe%F4n

SOOOO 迷路了。

我正在尝试以下列方式使用编码字符串:

失败:

http://us.battle.net/api/wow/character/Kil%27jaeden/Pe%F4n?fields=statistics

作品:

http://us.battle.net/api/wow/character/Kil%27jaeden/Pe%C3%B4n?fields=statistics

我的代码:

$name = mysqli_real_escape_string($connection, $_POST['name']);
$name = urlencode($name);

编辑:

$name = $_POST['name'];
$realm = mysqli_real_escape_string($connection, $_POST['realm']);
$locale = mysqli_real_escape_string($connection, $_POST['locale']);
$toon = query_blizz_toon($name, $realm, $locale);

function query_blizz_toon($name, $realm, $locale){  
    $realm = urlencode(stripslashes($realm));
    $name = urlencode($name);
    $q = 'http://'.$locale.'.battle.net/api/wow/character/'.$realm.'/'.$name.'?fields=statistics';
    echo $q;
    $character = @file_get_contents($q);
    $character = json_decode($character);
    return $character;
}

echo $q 输出:http://us.battle.net/api/wow/character/Kil%27jaeden/Pe%F4n?fields=statistics

即使没有转义,仍然会得到错误的编码...:/

编辑:

据本站:http://www.degraeve.com/reference/urlencoding.php

%F4ô 的正确编码 ...

【问题讨论】:

  • 你为什么在这里使用mysqli_real_escape_string?
  • name 变量来自带有文本输入字段的表单。
  • 我不知道你做错了什么,但你的例子对我来说很有趣。使用 tools4noobs.com/online_php_functions/urlencode – floww 刚刚编辑

标签: php mysql sql function utf-8


【解决方案1】:

嗯,我得到的正是你期望得到的。您的 mysqli_real_escape 是这里的罪魁祸首。删除它。

另外,利用Prepared Statements,这样你就不必专注于转义之类的事情了。

<?php
$name = 'Peôn';
echo $name = urlencode($name);

输出:

Pe%C3%B4n

【讨论】:

  • 将移至准备好的语句。在没有转义的情况下仍然得到错误的编码。上面贴了完整的代码。
  • 相同的结果:/。我最初尝试过,然后再在这里询问。在query_blizz_toon() 调用之前调用urlencode()rawurlencode() 也会产生Pe%F4n
  • 我在自己的文件中单独运行了以下代码:$name = 'Peôn'; echo $name = urlencode($name); 输出:Pe%F4n
  • mysqli_real_escape与此问题无关。
【解决方案2】:
$name = rawurlencode(utf8_encode($name));

成功了。希望我知道为什么...

【讨论】:

    【解决方案3】:

    问题在于具有表单的页面。

    网络浏览器正在发送以 latin-1 编码的用户输入,但您希望它发送 UTF-8。解决这个问题的一种方法是发送 Content-Type 标头来告诉浏览器页面是 UTF-8 格式,如果你不能这样做,你可以使用 HTML 元标记来做同样的事情,另一种方法是声明 @ 987654321@在表单标签中。

    <form accept-charset="UTF-8" method="POST" action="...
    

    【讨论】:

    • 设置 Content-Type 标头没有任何区别。我没有检查表单的接受字符集,但我发布的答案确实解决了这个问题。谢谢你的回复。
    • 适当的修复是让浏览器使用 UTF-8 编码来发送表单。您在答案中发布的内容有助于缓解症状,即将 latin1 编码的文本转换为 UTF-8,但如果用户有可能发送无法以 latin1 编码的内容,例如俄语或日语,您将继续有问题。
    • 在我的应用程序中,我很可能会遇到所说的发送俄语或日语字符的情况,因此我会研究您的解决方案并更改所选答案以解决问题。
    最近更新 更多