【发布时间】:2012-08-20 03:31:47
【问题描述】:
我目前正在开发一个从暴雪社区 API 提取 JSON 数据并使用 PHP 解析它的应用程序。一切正常,直到我遇到一个名字中有特殊字符的角色。
为了提取角色数据,我需要知道他们的角色名称和他们所在的领域。
我通过 URL 将名称和领域传递到角色页面,并从那里使用该信息提取角色数据。
此时我的网址是这样的:
http://localhost/guildtree/characters.php?realm=argent-dawn&name=Ankzu
此时,如果我尝试提取带有重音符号的字符的数据,我会被重定向到我的错误页面,因为它不是有效字符。
直到我开始 URL 重写,我才发现我的问题。我被重定向到我的错误页面,因为在某处特殊字符被替换为一些非常不稳定的字符。
使用我重写的新 URL,以下工作正常:
http://localhost/guildtree/argent-dawn/ankzu
但是,名称中带有特殊字符的字符会导致错误消息。
http://localhost/guildtree/argent-dawn/notúk
导致以下错误消息:
“未找到
在此服务器上找不到请求的 URL /guildtree/argent-dawn/notúk。"
正如您所见,ú 被 ú 取代,但是当我复制并粘贴 URL 时,ú 显示为 %C3%BA
据我了解,ú 显示为 ú 的原因是因为两个字节的 unicode ú 被压缩成两个一个字节的 ASCII 字符,导致显示 ú。
我已确保我的所有页面的标题中都有以下内容:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
为了让我的应用程序正常工作,我需要那些特殊字符才能正确显示,所以我需要 ú 实际显示为 ú,而不是显示为 ú 但实际上是 ú 或 %C3%BA。
正在从 URL 中提取字符名称,如下所示:
$charName = $_GET['name'];
是否可以对 $charName 进行编码以正确显示特殊字符?
我已经尝试了所有我能想到的方法并在 Google 上进行了搜索,但没有任何效果。
另外,因为我正在使用 URL 重写,所以重写规则允许这些特殊字符是什么?
这是我目前的重写规则:
RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$ characters.php?realm=$1&name=$2 [NC]
我知道 ([a-zA-Z]+) 根本不允许特殊字符,我目前一直在努力让特殊字符正确显示。如果我使用 ([a-zA-Z\ú]+) 它将工作并显示需要显示的页面。将 \ú 添加到规则中似乎是一种非常糟糕的方法,并且在使用重音字符的相应字符时并不总是有效。
任何帮助将不胜感激。如果您需要更多信息,请询问。
编辑:
将我的重写规则更改为以下允许正确提取信息,但会为我的 CSS 创建一个重定向循环。
RewriteRule ^([a-zA-Z0-9_'-]+)/([^/]+)$ characters.php?realm=$1&name=$2 [NC]
例如,我的 CSS 被重定向到
http://localhost/guildtree/css/error
而不是
http://localhost/guildtree/css/style2.css
更新:
通过几个简单的测试:
$charName = $_GET['name'];
$charNameTEST = utf8_encode($charName);
会做出改变,但是当我将它应用到我的页面时,它仍然会出现:
“未找到
在此服务器上找不到请求的 URL /guildtree/argent-dawn/notúk。"
我认为现在的主要问题是 URL 重定向,因为当 JSON 数据具有重音字符时,它可以很好地解析。我只是不明白为什么它一直显示它在浏览器栏中的 guildtree/argent-dawn/notúk 上,但一直试图拉起 /guildtree/argent-dawn/notúk。
【问题讨论】:
标签: php regex apache .htaccess url-rewriting