Như đã đề cập bởi những người khác, PHP 7 giới thiệu hỗ trợ \u
trực tiếp cho cú pháp Unicode.
Như những người khác đã đề cập, cách duy nhất để có được giá trị chuỗi từ bất kỳ mô tả ký tự Unicode hợp lý nào trong PHP, là chuyển đổi nó từ một thứ khác (ví dụ: phân tích cú pháp JSON, phân tích cú pháp HTML hoặc một số dạng khác). Nhưng điều này đi kèm với một chi phí hiệu suất thời gian chạy.
Tuy nhiên, có một lựa chọn khác. Bạn có thể mã hóa ký tự trực tiếp trong PHP bằng cách \x
thoát nhị phân. Các \x
cú pháp thoát cũng được hỗ trợ trong PHP 5 .
Điều này đặc biệt hữu ích nếu bạn không muốn nhập ký tự trực tiếp vào một chuỗi thông qua hình thức tự nhiên của nó. Ví dụ: nếu đó là một ký tự điều khiển vô hình hoặc khó phát hiện khoảng trắng khác.
Đầu tiên, một ví dụ bằng chứng:
// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = " ";
$realChar = html_entity_decode($htmlEntityChar);
$phpChar = "\xE2\x80\x8A";
echo 'Proof: ';
var_dump($realChar === $phpChar); // bool(true)
Lưu ý rằng, như Pacerier đã đề cập trong một câu trả lời khác, mã nhị phân này là duy nhất cho một mã hóa ký tự cụ thể. Trong ví dụ trên, \xE2\x80\x8A
là mã hóa nhị phân cho U + 200A trong UTF-8.
Câu hỏi tiếp theo là, làm thế nào để bạn nhận được từ U+200A
để \xE2\x80\x8A
?
Dưới đây là tập lệnh PHP để tạo chuỗi thoát cho bất kỳ ký tự nào, dựa trên chuỗi JSON, thực thể HTML hoặc bất kỳ phương thức nào khác khi bạn có chuỗi đó dưới dạng chuỗi gốc.
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