2016-06-21 235 views
1

我在PHP下面的代碼PHP utf8編碼和解碼

$test = "\151\163\142\156"; 
echo utf8_decode($test); 
var_dump($test); 

,我得到以下結果:

isbn 
string(4) "isbn" 

我從具有\一個txt文件中的一些文本151 \ 163 \ 142 \ 156文本

$all_text = file_get_contents('test.txt'); 
var_dump($all_text); 

結果:

string(16) "\151\163\142\156" 

我有以下問題:

  1. 我怎樣才能UTF8解碼的第二個文本,所以我得到的ISBN結果呢?

  2. 如何編碼isbn以獲得\ 151 \ 163 \ 142 \ 156?

編輯

(從評論)

我試着用的iconv和編碼,但沒有一切正常。 .txt文件中的文本是字符串(16)而不是字符串(4),所以我可以對其進行編碼。 txt文件從崇高保存與西方(ISO 8859-1)編碼

+3

真的嗎? 'utf8_decode($ all_text);'? 'utf8_encode('你需要什麼')'? –

+0

不起作用。我得到相同的文本,而不是編碼的文本。你可以看到第一個$ test是字符串(4),第二個是字符串(16) –

+0

你是否解碼第二個字符串?顯示__DECODED__的輸出''$ all_text' –

回答

1

這有絕對無關採用UTF-8編碼。完全忘掉那部分。 utf8_decode在您的代碼中不會執行任何操作。 iconv是完全不相關的。

它與PHP字符串文字解釋。在"\151\163\142\156"\...是一個特殊的PHP字符串文字轉義序列:

\[0-7]{1,3}
匹配正則表達式的字符序列爲八進制符號表示的字符,這默默地溢出,以適應在一個字節(例如,「\ 400 「===‘\ 000’)

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.double

這很容易解釋爲什麼它寫在PHP字符串常量時,從一O讀取時不工作utside源(因爲通過file_get_contents讀取的外部文本不被解釋爲PHP代碼)。只需執行echo "\151\163\142\156",您將看到「isbn」,無需其他任何轉換。

要手動轉換的單個轉義序列串\151\163\142\156到他們的性格當量(真:他們的字節當量):

$string = '\151\163\142\156'; // note: single quotes cause no iterpretation 
echo preg_replace_callback('/\\\\([0-7]{1,3})/', function ($m) { 
    return chr(octdec($m[1])); 
}, $string) 
// isbn 

stripcslashes恰好包含此功能,但它也做了一大堆的其他可能是不希望的事情。

其他各地的道:

$string = 'isbn'; 
preg_replace_callback('/./', function ($m) { 
    return '\\' . decoct(ord($m[0])); 
}, $string) 
// \151\163\142\156 
+0

謝謝。這就是我想要做的。 –

1

嘗試使用stripcslashes

<?php 

$test = "\151\163\142\156"; 
echo utf8_decode($test);       // "isbn" 
var_dump($test); 

echo "<br/><br/><br/>"; 

$all_text = file_get_contents("test.txt"); 
echo utf8_decode($all_text) .     // "\151\163\142\156" 
    "<br/>" . 
    utf8_decode(stripcslashes($all_text)); // "isbn" 
var_dump(stripcslashes($all_text)); 

?> 

與此文件測試:

這是一些文本:

\ 151 \ 163 \ 142 \ 156

而這是更多的文字!

接下來是如何字符轉換爲代碼:

<?php 
$test = "isbn"; 
$coded = ""; 
for ($i = 0; $i < strlen($test); $i++) // PROCESS EACH CHAR IN STRING. 
    $coded .= "\\" . decoct(ord($test[ $i ])); // CHAR CODE TO OCTAL. 

echo $coded .       // "\151\163\142\156" 
    "<br/>" . 
    stripcslashes($coded);   // "isbn". 
?> 

讓我們把它更普遍的與我們可以在任何地方調用一個函數:

<?php 
function code_string ($s) 
{ $coded = ""; 
    for ($i = 0; $i < strlen($s); $i++) 
    $coded .= "\\" . decoct(ord($s[ $i ])); 
    return $coded; 
} 

$x = code_string("isbn"); 
echo $x .       // "\151\163\142\156" 
    "<br/>" . 
    stripcslashes($x);   // "isbn". 
?> 
+0

你完全可以擺脫'utf8_decode',它在這裏什麼都不做。 – deceze

+0

@deceze,我同意,但OP似乎喜歡它(文本文件可能會出現奇怪的字符)。 –

+1

我以爲你試圖教育OP他們做錯了什麼和/或誤解......!? :-P – deceze