2010-05-18 38 views

回答

9

這是JavaScript的escape()格式。它與URL編碼類似但不兼容。完全使用它通常是一個錯誤。

最好的辦法是改變生成它的腳本,使用正確的URL編碼(encodeURIComponent())代替。然後,您可以使用urldecode或服務器端的任何其他常規URL解碼功能對其進行解碼。

如果您絕對必須以非標準格式交換數據,您必須爲其編寫自定義解碼器。這是一個利用HTML字符參考解碼器的快速入門:

function jsunescape($s) { 
    $s= preg_replace('/%u(....)/', '&#x$1;', $s); 
    $s= preg_replace('/%(..)/', '&#x$1;', $s); 
    return html_entity_decode($s, ENT_COMPAT, 'utf-8'); 
} 

這將返回一個原始的UTF-8字節字符串。如果您確實需要使用HTML字符引用(如Ру...),則請撥打html_entity_decode電話。但通常你不會。最好保留原始格式的字符串,直到它們需要轉義以進行最終輸出爲止 - 並且除非您確實需要,否則最好不要用字符引用替換非ASCII字符。

什麼?如果有的像這個字符串會來找我 '%CE%EB%E5%E3 +%DF%EA%F3%F8%EA%E8%ED'

這就是URL的形式編碼,它不直接兼容escape()格式。雖然URL編碼的2位字節轉義不同於瘋狂的escape格式4位代碼單位轉義,但字符+不明確。這可能意味着一個加號(如果字符串來自escape)或空格(如果它來自瀏覽器表單提交)。沒有辦法確定它是什麼。這是不使用escape()的另一個原因。

除此之外;如果這個字符串的字符集是UTF-8,那麼是的,上面的函數會很好,將URL編碼字節和瘋狂的escape() -format Unicode字符轉換爲原始的UTF-8字節。

但它實際上似乎是代碼頁1251(Windows俄羅斯語)。你真的想在cp1251中處理你所有的字符串嗎?如果是這樣,你將不得不改變它以使它將四位轉義符編碼成不同的字符集。這是凌亂:

function url_or_maybe_jsescape_decode($s, $charset, $isform) { 
    if ($isform) 
     $s= str_replace('+', ' ', $s); 
    $s= preg_replace('/%u(....)/', '&#x$1;', $s); 
    $s= preg_replace('/%(..)/', '&!#x$1;', $s); 
    $s= html_entity_decode($s, ENT_COMPAT, $charset); 
    $s= str_replace('&!', '&', $s); 
    $s= html_entity_decode($s, ENT_COMPAT, 'utf-8'); 
    return $s; 
} 

echo url_or_maybe_jsescape_decode('%CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED', 'cp1251', TRUE); 

我會強烈建議:

  1. 固定Flash文件,以便它使用正確的encodeURIComponent而不是escape,所以你可以使用一個標準的URL解碼器,而不是這個醜陋的黑客攻擊。

  2. 使用UTF-8代替全部通過您的應用程序,因此您可以支持除俄羅斯以外的其他語言,並且您不必擔心提交的表單的輸入編碼更改。

(所有編碼都不是UTF-8吸引,這是FACT證明的FACT!)

+0

它對我來說工作正常現在(當我使用Flash的時候)但是如果像這樣的字符串會出現在我的頭上'%CE%EB%E5%E3 +%DF%EA%F3%F8%EA%E8%ED'您的功能會對它造成任何傷害? – Rella 2010-05-18 20:20:36

+0

我的意思是鋼鐵看起來像ОлегЯкушкин在瀏覽器中顯示? – Rella 2010-05-18 20:21:41

+0

最後一個完整的答案(與解決方法)解決了JavaScript的'escape()'和正確的URL編碼之間的不兼容問題。 - 問題的標題,以便後代可以從中獲利 – 2010-05-18 21:04:36

2

PHP具有解碼功能

$string = html_entity_decode($string,ENT_COMPAT,"UTF-8") 
+0

是什麼意思ENT_COMPAT? – Rella 2010-05-18 18:49:59

+0

這是一個HTML解碼器。 '%u ....'不是HTML編碼的。 – bobince 2010-05-18 18:50:23

+0

它可以用C#或任何其他語言編碼的字符串嗎? – Rella 2010-05-18 18:52:41

0

正如其他人所建議的那樣,將其轉換爲Unicode HTML實體。這個由Flash「逃生(字符串)」產生的正則表達式我用,

function escapePercentU($s) { 
    $s = preg_replace("/%u([A-Fa-f0-9]{4})/", "&#x$1;", $s); 
    return html_entity_decode($s, ENT_COMPAT, 'utf-8'); 
}