2016-06-21 27 views
1

私はPHPでPHP UTF8エンコードとデコード

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

を次のコードを持っていると私は次のような結果を得る:私は\ 151を持っているtxtファイルからテキストを取得

isbn 
string(4) "isbn" 

を\ 142 \ 163 156テキスト

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

結果\:

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

私は、次の質問がある:私はISBN結果を得るよう

  1. どのように私は、2番目のテキストをデコードUTF8ことができますか?

  2. \ 151 \ 163 \ 142 \ 156を取得するにはisbnをどのようにエンコードできますか? (コメント)

EDIT

私はiconvのとエンコードですべてを試してみましたが、何も働きました。 .txtファイルのテキストはstring(16)であり、string(4)ではないので、私はそれをエンコードすることができます。 txtファイルは西(ISO 8859-1)エンコーディングで崇高から保存され

+3

? 'utf8_decode($ all_text);'? 'utf8_encode( '何が必要なの?')? –

+0

は動作しません。私は同じテキストを取得し、エンコードされたテキストは取得しません。最初の$ testはstring(4)、2番目はstring(16)です –

+0

2番目の文字列をデコードしますか? __DECODED__ '$ all_text'の出力を表示します –

答えて

1

UTF-8エンコーディング。その部分について完全に忘れてしまった。 utf8_decodeあなたのコードで何もしません。 iconvは完全に無関係です。

これは、PHP文字列リテラル解釈と関係がある。正規表現にマッチする文字シーケンスは黙っバイトに収まるように溢れて進表記の文字は、(

\[0-7]{1,3}
である例えば「\ 400:"\151\163\142\156"\...は特別なPHPの文字列リテラルのエスケープシーケンスであります"===『\ 000』)

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.double oから読み込むときに、非常に簡単にリテラルPHPの文字列で書かれたときにそれが動作する理由を説明すると、動作しません

(外部テキストがfile_get_contentsで読み取られているため、PHPコードとして解釈されていないため)。単にecho "\151\163\142\156"を実行すると、他の変換を必要とせずに「isbn」が表示されます。

$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は、この機能が含まれるように起こるが、それはまた、他の全体の多くを行います。手動(:そのバイト相当本当に)その文字同等に文字列\151\163\142\156内の個々のエスケープシーケンスを変換するには

望ましくないかもしれない事柄。

他の方法で回避:真剣

$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

関連する問題