2016-06-19 73 views
1

如何從十六進制UTF-8值打印UFT-8字符?我讀this後,但它並沒有解決我的問題...如何在PHP中打印十六進制UTF-8字符

我使用許多字符串是存儲在數據庫中的梵語字。我有他們的HTML值,16位二進制代碼點,十六進制代碼和十進制代碼,但我希望能夠使用它們的十六進制UTF-8值並輸出它們的符號形式。

例如,這裏是一個字,其二進制UTF-8值爲111000001010010010111000111000001010010010101110。我想查看/存儲/打印它的十六進制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:修訂。道歉 – Arya

回答

2

您的二進制文件是錯誤的(我在下面固定它)

您正在包含文本「\ xe0」,而不是其表示,十六進制僅僅是一個數字真正的字符的字符串。

這似乎現在的工作

<?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 
    ); 
} 

這個問題讓我想起有多窮PHP是多字節支持

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. 
相關問題