【问题标题】:Can't grab string from URL with special characters无法从带有特殊字符的 URL 中获取字符串
【发布时间】:2015-10-15 09:24:19
【问题描述】:

我有一个 UTF8 unicode ci 排序规则的数据库,它存储带有特殊字符的值,例如:

oukaïmeden

我希望能够形成如下网址:

example.com/oukaïmeden

example.com/index.php?id=oukaïmeden

在 index.php 中,我将 HTML 字符集设置为 UTF8(与输出无关),并将 PHP 文件保存为 UTF8 unicode ci。

但是,无论我做什么,我都看不到以 oukaïmeden 形式获取字符串,因此我可以使用它来搜索数据库。

$aparams = explode("/", $_SERVER["REQUEST_URI"]);
extract($_GET);
$id = utf8_decode($aparams[1]);
echo $id;
echo urldecode($id);
echo utf8_decode($id);
echo utf8_encode($id);  

我得到如下值:

ouka%C3%AFmeden
oukaïmeden

我认为我的问题是“我怎样才能让字符串显示变音符号,以便我可以使用它来搜索/比较等?”但实际上我想知道我是否也应该进行不同的搜索?

【问题讨论】:

    标签: php unicode encoding utf-8


    【解决方案1】:

    URL 不能包含非 ASCII 字符。 URL必须看起来像这样首先是正确的:

    example.com/index.php?id=ouka%C3%AFmeden
    

    这是 UTF-8 编码单词“oukaïmeden”的正确 percent-encoded 表示。浏览器可能会或可能不会在您的地址栏中将其显示为“oukaïmeden”,但实际 URL 必须如上。

    在 PHP 中,从$_GET 读取此内容将为您提供已解码的值。因此,要在 PHP 脚本中获取 UTF-8 编码的字符串:

    $id = $_GET['id'];
    

    是的,就是这样。什么都不需要了。

    【讨论】:

    • 谢谢,这是有道理的,但是我仍然使用“ouka%C3%AFmeden”而不是“oukaïmeden”查询我的数据库,它没有返回任何结果。我应该以不同的方式存储我的数据(百分比编码)还是修改百分比编码值以进行查询?
    • 再次:从$_GET 获取值,它已经解码$_GET['id'] 是“oukaïmeden”(UTF-8 编码),而不是“ouka%C3%AFmeden”。
    • 但这不是我在测试中看到的,我没有使用 GET。我在 htaccess 中使用 mod-rewrite 并在 REQUEST_URI $_SERVER 全局上使用 explode 是否有区别?
    • 如果我只看 $_GET['id'],通过 extract(),我会得到“oukaïmeden”。
    • $_SERVER 中的数据未自动解码。您看到$_GET 是因为您的浏览器没有将结果解释为UTF-8。数据很好。
    【解决方案2】:

    这是使用的输出,所以正确使用的是“utf8_encode”

    $id = $_GET['id'];
    $id = utf8_decode($id);
    echo $id."<br />";
    echo urldecode($id)."<br />";
    echo utf8_decode($id)."<br />";
    echo utf8_encode($id)."<br />";  
    
    ouka�meden
    ouka�meden
    ouka?meden
    oukaïmeden
    

    【讨论】:

    • 您是否尝试将其放在您的 标记“"
    • 是的,我在原帖中提到了这一点。
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多