2016-06-19 9 views
1

Wie UFT-8-Zeichen aus ihren hexadezimalen UTF-8-Werten zu drucken? Ich lese this Beitrag, aber es hat mein Problem nicht gelöst ...So drucken Sie Hexadezimal-UTF-8-Zeichen in PHP

Ich arbeite mit vielen Zeichenfolgen, die Sanskrit Wörter in einer Datenbank gespeichert sind. Ich habe ihre HTML-Werte, 16-Bit-Binärcode Punkte, Hex-Codes und Dezimal-Codes, aber ich möchte mit ihren Hexadezimal UTF-8 Werte arbeiten und ihre symbolische Form ausgeben können.

Zum Beispiel ist hier ein Wort , das einen binären UTF-8-Wert von 111000001010010010111000111000001010010010101110 hat. Ich möchte seinen hexadezimalen UTF-8-Wert sehen/speichern/drucken und seine symbolische Form drucken.

Zum Beispiel, hier ist ein Ausschnitt aus meinem Code:

$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; 

Die Ausgabe lautet:

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

$ Test gibt die gewünschten Zeichen ein.

Warum gibt $ HexadecimalUTF8 die gewünschten Zeichen nicht aus?

+0

Ihre Frage mit Syntaxfehlern gespickt ist, offensichtlich in keinem Zusammenhang mit Ihrem Problem, wie fehlende Semikolons und Dollarzeichen. Können Sie bitte überarbeiten? –

+0

@JeffPuckettII: Überarbeitet. Entschuldigung – Arya

Antwort

2

Ihre binär ist falsch (ich es unten fest)

Sie machen einen String mit dem Text „\ xe0“ statt das Zeichen enthält, die darstellt, dass, The Hex wirklich nur eine Zahl ist.

Dies scheint jetzt

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

Diese Frage erinnert mich, wie schlecht PHP für Multi-Byte-Unterstützung zu arbeiten, ist

1

Um UTF-8-Zeichen aus dem Dezimalwert drucken Sie diese Funktion

können
<?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. 

Für Ihre Schnipsel können Sie versuchen, diese ... und überprüfen Sie es in 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… 

Eine andere nette Inline Lösung ist die folgende ... (php v5.6 + erforderlich) Überprüfen Sie es in 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.