2016-06-21 159 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