2012-08-24 79 views
7

我目前正在研究一個從暴雪社區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 

導致以下錯誤信息:

「沒有找到

所請求的網址/ guildtree /銀色黎明/notúk在此服務器上找到」

正如你可以看到U是被取代ú,但是當我複製並粘貼URL將U顯示爲%C3%BA

這是我的理解是,之所以U是表現爲ú是因爲兩個字節的unicodeú被壓縮成兩個一個字節的ASCII字符,導致正在顯示ú。

我已經確保了我所有的頁面都在標題下面:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

爲了讓我的應用程序正常工作,我需要這些特殊字符能正確顯示,所以我需要在U實際顯示如ú,不顯示爲ú但實際上是ú或%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 /銀色黎明/notúk在此服務器上找到「。

我認爲現在的主要問題是URL重定向,因爲JSON數據在具有重音字符時可以很好地解析。我只是不明白爲什麼它會一直向我展示它在瀏覽器欄中的guildtree/argent-dawn /notúk上,但不斷嘗試拉起/ guildtree/argent-dawn /notúk。

回答

3

ú不是一個有效的字符,對於一個URL。

無論您何時鏈接用戶名,您都應該對其進行網址編碼。

因此,正確的URL指向是:

http://localhost/guildtree/argent-dawn/not%C3%BAk 

你應該在PHP打印爲:

echo '<a href="http://localhost/guildtree/argent-dawn/'. urlencode($name) .'">Link</a>; 
+0

當有人直接輸入網址時怎麼辦? – akari

+0

您可能還想考慮ASCII用戶名。 'example.com/guildtree/argent-dawn/notuk /'而不是'example.com/guildtree/argent-dawn/not%C3%BAk'。您的用戶可能會覺得更容易。 –

+0

example.com/guildtree/argent-dawn/notuk和example.com/guildtree/argent-dawn/notúk雖然會提取兩組完全不同的數據,但角色名稱必須精確。 – akari

2

我想this question可能有你的答案。我有這個我試過,但是從我所看到的,你需要重寫你的重寫規則爲:

RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$  characters.php?realm=$1&name=$2  [NC,B] 

標誌將確保特殊字符的URL轉義,所以在$ 2中按姓名顯示的值將以百分比編碼。由於您沒有進行重定向,因此原始Unicode字符仍應該是URL中顯示的內容。

您還需要對正則表達式進行一些更改以確保它與unicode字符匹配。我不確定那會是什麼。

還有一些更多的描述如何unicode characters work in URLs over here

+0

我綁定了,但它創建了一個內部服務器錯誤。編輯:有一個錯字,現在沒有內部錯誤,但仍然無法正常工作。 – akari

2

爲了讓這個工作正常,你需要做兩件事。

首先添加到您的.htaccess

AddDefaultCharset On 
AddDefaultCharset UTF-8 
AddCharset UTF-8 .tpl 
AddCharset UTF-8 .js 
AddCharset UTF-8 .css 
AddCharset UTF-8 .php 

其次改變這種狀況需要允許特殊字符到你的重寫規則的一部分,像這樣(*):

RewriteRule ^([a-zA-Z0-9_'-]+)/(.*)$  characters.php?realm=$1&name=$2  [NC] 

這將導致其他頁面出現一些重定向循環,但我正在努力解決此問題。