2016-06-19 8 views
1

UFT-8文字を16進UTF-8値から印刷するにはどうすればいいですか?私はthisポストを読むが、それは私の問題を解決しなかった...PHPで16進UTF-8文字を印刷する方法

私はデータベースに格納されているサンスクリット語である多くの文字列を扱う。 HTML値、16ビットのバイナリコードポイント、16進コード、10進コードがありますが、その16進UTF-8の値を使用して記号形式を出力したいと考えています。

たとえば、という単語があり、バイナリUTF-8の値は111000001010010010111000111000001010010010101110です。私は16進数のUTF-8値を表示/保存/出力し、その象徴的な形式を表示したい。

たとえば、ここに私のコードの抜粋です:

$BinaryUTF8 = "111000001010010010000110111000001010010010101110"; 

$Temporary = dechex(bindec($BinaryUTF8)); 

$HexadecimalUTF8 = NULL; 

for($i = 0; $i < strlen($Temporary); $i+=2) 
{ 
    $HexadecimalUTF8 .= "\x".$Temporary[$i].$Temporary[$i+1]; 
} 

$Test = "\xe0\xa4\x86\xe0\xa4\xae"; 

echo "\$Test = ".$Test; 

echo "<br>"; 

echo "\$HexadecimalUTF8 = ".$HexadecimalUTF8; 

出力は次のとおりです。

$Test = आम 
$HexadecimalUTF8 = \xe0\xa4\x86\xe0\xa4\xae 

$テスト出力希望の文字。

なぜ$ HexadecimalUTF8が目的の文字を出力しないのですか?

+0

あなたの質問でそれを確認し、セミコロンやドル記号がないなどの問題があります。どうか改訂していただけますか? –

+0

@JeffPuckettII:Revised。謝罪 – Arya

答えて

2

あなたのバイナリは間違っている

を(私は下のそれを固定している)は、テキストは「\ xe0」の代わりに、Hexは本当にただの数である、ことを表す文字を含む文字列を作っています。

これは、マルチバイトのサポートのためにどのように貧しいPHPこの質問は私を思い出させる

<?php 
$BinaryUTF8 = "111000001010010010000110111000001010010010101110"; 

$Temporary = dechex(bindec($BinaryUTF8)); 

$HexadecimalUTF8 = NULL; 

for($i = 0; $i < strlen($Temporary); $i+=2) 
{ 
    $HexadecimalUTF8 .= '\x' . $Temporary[$i].$Temporary[$i+1]; 
} 

$Test = "\xe0\xa4\x86\xe0\xa4\xae"; 

echo "\$Test = ".$Test; 

echo "<br>"; 
echo "\$HexadecimalUTF8 = " . makeCharFromHex($HexadecimalUTF8); 

function makeCharFromHex($hex) { 
    return preg_replace_callback(
     '#(\\\x[0-9A-F]{2})#i', 
     function ($matches) { 

      return chr(hexdec($matches[1])); 
     }, 
     $hex 
    ); 
} 

今動作しているようです

1

あなたはこの機能を使用することができ、その小数点以下の値からUTF-8文字を印刷するには

<?php 

function chr_utf8($n,$f='C*'){ 
return $n<(1<<7)?chr($n):($n<1<<11?pack($f,192|$n>>6,1<<7|191&$n): 
($n<(1<<16)?pack($f,224|$n>>12,1<<7|63&$n>>6,1<<7|63&$n): 
($n<(1<<20|1<<16)?pack($f,240|$n>>18,1<<7|63&$n>>12,1<<7|63&$n>>6,1<<7|63&$n):''))); 
} 

echo chr_utf8(9405).chr_utf8(9402).chr_utf8(9409).chr_utf8(hexdec('24C1')).chr_utf8(9412); 

// Output ⒽⒺⓁⓁⓄ 

// Note : Use hexdec to print UTF-8 encoded characters from hexadecimal number. 

スニペットでこれを試してみてください。https://eval.in/748161

<?php 

// function chr_utf8 shown above is required… 

$BinaryUTF8 = "111000001010010010000110111000001010010010101110"; 

if (preg_match_all('#(0[01]{7})|(?:110([01]{5})10([01]{6}))|(?:1110([01]{4})10([01]{6})10([01]{6}))|(?:11110([01]{3})10([01]{6}),10([01]{6})10([01]{6}))#',$BinaryUTF8,$a,PREG_SET_ORDER)) 
$result=implode('',array_map(function($n){return chr_utf8(bindec(implode('',array_slice($n,1))));},$a)); 

echo $result; 

// Output आम 

// Note : If you work with "binary" the length of input must be multiple of 8. 
// You can't remove leading zeros because this regex will not detect the character… 

もう一つの素敵なインラインソリューションは、以下の...(のPHP V5.6 +必要)で、あなたの問題を明らかに無関係な構文エラー、だらけですhttps://eval.in/748162

<?php 

$BinaryUTF8 = "111000001010010010000110111000001010010010101110"; 
echo pack('C*',...array_map('bindec',str_split($BinaryUTF8,8))); 

// Output आम 

// Note : Length or $BinaryUTF8 of input must be multiple of 8. 
関連する問題