2013-07-09 2 views
5

У меня есть база данных, в которой хранятся имена видеоигр с символами Unicode, но я не могу понять, как правильно избежать этих символов Юникода при печати их в ответ HTML.Печать символов Юникода PHP

Например, когда я печатаю все игры с именем, как Uncharted, я получаю это:

Uncharted: Drake's Fortuneâ„¢ 
Uncharted 2: Among Thievesâ„¢ 
Uncharted 3: Drake's Deceptionâ„¢ 

но он должен показать это:

Uncharted: Drake's Fortune™ 
Uncharted 2: Among Thieves™ 
Uncharted 3: Drake's Deception™ 

Я побежал функцию быстрого JavaScript бежать к посмотрите, какой символ Юникода , и нашел, что это \u2122.

У меня нет проблем с полным экранированием каждого символа в строке, если я могу правильно отобразить символ . Я думаю, чтобы каким-то образом найти шестигранный представление каждого символа в строке и есть PHP делают символы Unicode, как это:

print "&#x2122"; 

Пожалуйста, руководство меня через лучший подход для Unicode спасаясь строку для того HTML дружелюбным. Я сделал что-то подобное для JavaScript, но JavaScript имеет встроенную функцию для escape и unescape.

Однако я не знаю никаких функций PHP аналогичной функции. Я прочитал о функции ord, но он просто возвращает код символа ASCII для заданного символа, следовательно, неправильное отображение ™ или ™. Я хотел бы, чтобы эта функция была достаточно универсальной для применения к любой строке, содержащей допустимые символы Unicode.

ответ

14

Похоже, у вас есть UTF-8 кодируются строки внутри, PHP выводит их правильно, но ваш браузер не может автоматически определить кодировку (это решает для ISO 8859-1 или некоторую другую кодировку).

Лучший способ заключается в сообщить браузеру, что UTF-8 в настоящее время используется, отправив соответствующий HTTP заголовок:

header("content-type: text/html; charset=UTF-8"); 

Затем, вы можете оставить остальную часть вашего кода как есть, и дон 't должен html-кодировать сущности или создавать другой беспорядок.

Если вы хотите, вы можете дополнительно объявить кодировку в генерируемой HTML, используя <meta> тег:

  • <meta http-equiv=Content-Type content="text/html; charset=UTF-8"> для HTML < = 4,01
  • <meta charset="UTF-8"> для HTML5

Заголовок HTTP имеет приоритет над тегом <meta>, но последний может быть полезен, если HTML сохраняется в формате HD и затем читается loc союзник.

9

Я потратил много времени, пытаясь найти лучший способ просто распечатать эквивалентный символ кода юникода, а методы, которые я нашел, не работали, или это было очень сложно.

При этом, JSON может представлять символы Юникода, используя синтаксис «\ и [unicode_code]», а затем:

echo json_decode('"\u00e1"'); 

Напечатает эквивалент Юникода символ, в данном случае: а.

P.D. Обратите внимание на простые и двойные кавычки. Если вы не ставите оба, это не сработает.

1
// PHP 7.0 
var_dump(
    IntlChar::chr(0x2122), 
    IntlChar::chr(0x1F638) 
); 

var_dump(
    utf8_chr(0x2122), 
    utf8_chr(0x1F638) 
); 

function utf8_chr($cp) { 

    if (!is_int($cp)) { 
     exit("$cp is not integer\n"); 
    } 

    // UTF-8 prohibits characters between U+D800 and U+DFFF 
    // https://tools.ietf.org/html/rfc3629#section-3 
    // 
    // Q: Are there any 16-bit values that are invalid? 
    // http://unicode.org/faq/utf_bom.html#utf16-7 

    if ($cp < 0 || (0xD7FF < $cp && $cp < 0xE000) || 0x10FFFF < $cp) { 
     exit("$cp is out of range\n"); 
    } 

    if ($cp < 0x10000) { 
     return json_decode('"\u'.bin2hex(pack('n', $cp)).'"'); 
    } 

    // Q: Isn’t there a simpler way to do this? 
    // http://unicode.org/faq/utf_bom.html#utf16-4 
    $lead = 0xD800 - (0x10000 >> 10) + ($cp >> 10); 
    $trail = 0xDC00 + ($cp & 0x3FF); 

    return json_decode('"\u'.bin2hex(pack('n', $lead)).'\u'.bin2hex(pack('n', $trail)).'"'); 
} 
Смежные вопросы