PHP utf8编码和解码

时间:2016-06-21 20:11:44

标签: php utf-8 decode encode

我在php中有以下代码

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

我得到以下结果:

isbn
string(4) "isbn"

我从包含\ 151 \ 163 \ 142 \ 156文本

的txt文件中获取了一些文本
$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?

  3. 修改

    (来自评论)

    我用iconv和编码尝试了一切,但没有任何效果。 .txt文件中的文本是字符串(16)而不是字符串(4),因此我可以对其进行编码。 txt文件使用Western(ISO 8859-1)编码

    从sublime保存

2 个答案:

答案 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".
?>

答案 1 :(得分:1)

这与UTF-8编码完全无关。完全忘掉那个部分。 utf8_decode在您的代码中没有做任何事情。 iconv完全不相关。

它与 PHP字符串文字解释有关。 \...中的"\151\163\142\156"是一个特殊的PHP字符串文字转义序列:

  

\[0-7]{1,3}
  与正则表达式匹配的字符序列是八进制表示法中的字符,它以无提示方式溢出以适合一个字节(例如&#34; \ 400&#34; ===&#34; \ 000&#34;)

     

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

这很容易解释为什么它在PHP字符串文字中编写时起作用,并且在从外部源读取时不起作用(因为通过file_get_contents读取的外部文本不被解释为PHP代码)。只需echo "\151\163\142\156",您就会看到&#34; isbn&#34;没有任何其他必要的转换。

手动将字符串\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