Jak wspominali inni, PHP 7 bezpośrednio wprowadza obsługę \u
składni Unicode.
Jak również wspominali inni, jedynym sposobem na uzyskanie wartości ciągu z dowolnego sensownego opisu znaku Unicode w PHP jest przekonwertowanie go z czegoś innego (np. Parsowanie JSON, parsowanie HTML lub inna forma). Ale wiąże się to z kosztem wydajności w czasie wykonywania.
Jest jednak jeszcze jedna opcja. Możesz kodować znak bezpośrednio w PHP za pomocą \x
binarnych znaków ucieczki. \x
Składnia ucieczka jest również obsługiwana w PHP 5 .
Jest to szczególnie przydatne, jeśli nie chcesz wprowadzać znaku bezpośrednio w ciągu w jego naturalnej formie. Na przykład, jeśli jest to niewidoczny znak sterujący lub inny trudny do wykrycia biały znak.
Najpierw przykład dowodu:
// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = " ";
$realChar = html_entity_decode($htmlEntityChar);
$phpChar = "\xE2\x80\x8A";
echo 'Proof: ';
var_dump($realChar === $phpChar); // bool(true)
Zauważ, że jak wspomniał Pacerier w innej odpowiedzi, ten kod binarny jest unikalny dla określonego kodowania znaków. W powyższym przykładzie \xE2\x80\x8A
jest kodowanie binarne dla U + 200A w UTF-8.
Następne pytanie brzmi: jak dostać się z U+200A
do \xE2\x80\x8A
?
Poniżej znajduje się skrypt PHP do generowania sekwencji ucieczki dla dowolnego znaku na podstawie ciągu JSON, encji HTML lub dowolnej innej metody, gdy masz ją jako natywny ciąg.
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