Come menzionato da altri, PHP 7 introduce direttamente il supporto per la \u
sintassi Unicode.
Come menzionato anche da altri, l'unico modo per ottenere un valore di stringa da qualsiasi descrizione sensibile dei caratteri Unicode in PHP è convertirlo da qualcos'altro (ad esempio analisi JSON, analisi HTML o qualche altra forma). Ma questo ha un costo in termini di run-time.
Tuttavia, c'è un'altra opzione. Puoi codificare il personaggio direttamente in PHP con \x
escape binario. La \x
sintassi di escape è supportata anche in PHP 5 .
Ciò è particolarmente utile se si preferisce non inserire il carattere direttamente in una stringa attraverso la sua forma naturale. Ad esempio, se si tratta di un personaggio di controllo invisibile o di altri spazi difficili da rilevare.
Innanzitutto, un esempio di prova:
// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = " ";
$realChar = html_entity_decode($htmlEntityChar);
$phpChar = "\xE2\x80\x8A";
echo 'Proof: ';
var_dump($realChar === $phpChar); // bool(true)
Si noti che, come indicato da Pacerier in un'altra risposta, questo codice binario è unico per una codifica di caratteri specifici. Nell'esempio sopra, \xE2\x80\x8A
è la codifica binaria per U + 200A in UTF-8.
La prossima domanda è: come si arriva da U+200A
a \xE2\x80\x8A
?
Di seguito è riportato uno script PHP per generare la sequenza di escape per qualsiasi carattere, basato su una stringa JSON, un'entità HTML o qualsiasi altro metodo dopo averlo utilizzato come stringa nativa.
function str_encode_utf8binary($str) {
/** @author Krinkle 2018 */
$output = '';
foreach (str_split($str) as $octet) {
$ordInt = ord($octet);
// Convert from int (base 10) to hex (base 16), for PHP \x syntax
$ordHex = base_convert($ordInt, 10, 16);
$output .= '\x' . $ordHex;
}
return $output;
}
function str_convert_html_to_utf8binary($str) {
return str_encode_utf8binary(html_entity_decode($str));
}
function str_convert_json_to_utf8binary($str) {
return str_encode_utf8binary(json_decode($str));
}
// Example for raw string: Unicode Character 'INFINITY' (U+221E)
echo str_encode_utf8binary('∞') . "\n";
// \xe2\x88\x9e
// Example for HTML: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_html_to_utf8binary(' ') . "\n";
// \xe2\x80\x8a
// Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
// \xe2\x80\x8a