PHP utf8编码和解码

PHP utf8编码和解码,php,utf-8,decode,encode,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" 我

我有以下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"
我有以下问题:

  • 如何用utf8解码第二个文本,从而得到isbn结果

  • 如何对isbn进行编码以获取\151\163\142\156

  • 编辑

    (来自评论)


    我尝试了iconv和encode的所有功能,但没有任何效果。txt文件中的文本是字符串(16)而不是字符串(4),因此我可以对其进行编码。txt文件是使用西方(ISO 8859-1)编码从sublime保存的

    尝试使用
    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".
    ?>
    

    这与UTF-8编码完全无关。完全忘记这一部分<代码>utf8_解码
    在代码中不起任何作用<代码>iconv完全不相关

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

    \[0-7]{1,3}

    与正则表达式匹配的字符序列是八进制表示法的字符,它会自动溢出以适应字节(例如“\400”=“\000”)

    这很容易解释为什么它在用PHP字符串文字编写时工作,而在从外部源读取时不工作(因为通过
    file\u get\u contents
    读取的外部文本不会被解释为PHP代码)。只需执行
    echo“\151\163\142\156”
    ,您将看到“isbn”,而无需进行任何其他转换

    要手动将字符串
    \151\163\142\156
    中的各个转义序列转换为它们的字符等价物(实际上是它们的字节等价物),请执行以下操作:

    恰巧包括了这个功能,但它也做了很多其他可能不需要的事情

    反过来说:

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

    真的吗<代码>utf8解码($all_文本)<代码>utf8\u编码(“您需要的”)?这不起作用。我得到的是相同的文本,而不是编码的文本。如您所见,第一个$test是string(4),第二个是string(16),您是否解码第二个string?显示已解码的
    $all_text
    $all_text\u utf8\u DECODED=utf8\u解码的输出(文件获取内容('test.txt')
    这有什么关系吗,因为
    file\u get\u contents
    是文件的参考点,而不是数据本身的容器?你可以完全摆脱
    utf8\u decode
    ,它在这里什么都不做。@deceze,我同意,但OP似乎喜欢它(可能文本文件会带有奇怪的字符).我以为你是想让OP知道他们做错了什么和/或误解了什么…!?:-谢谢你们。您的和@deceze都是一个很好的解决方案。谢谢。这就是我想做的。
    $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
    
    $string = 'isbn';
    preg_replace_callback('/./', function ($m) {
        return '\\' . decoct(ord($m[0]));
    }, $string)
    // \151\163\142\156