Подтвердить что ты не робот

Jquery.text() и unicode

Я хотел бы отобразить символ "Открыть замок" в тексте HTML-ссылки.

Если я делаю это непосредственно, он корректно отображается с помощью <a id="myId">&#x1f512;</a>, но я не нашел возможности изменить его динамически с помощью функции jQuery .text(), например, в:

 $("#myID").text(openLockText);

Что следует добавить в openLockText?

4b9b3361

Ответ 1

Javascript внутренне поддерживает только UTF-16.

Поскольку это расширенный 32-битный символ UTF (не в "Basic Multilingual Plane" ), вам нужно вставить "суррогатную пару UTF-16", которая предоставляется на той же странице, на которую вы ссылались:

0xD83D 0xDD13

то есть.

$('#myId').text('\ud83d\udd13');

Более подробную информацию можно найти в RFC 4627, которая, строго говоря, является форматом JSON.

Ответ 2

Вы можете поместить символ там напрямую, в качестве цитируемой строки, например.

$("#myID").text('🔓');

при условии, что файл закодирован в кодировке UTF-8, и вы правильно объявите кодировку символов. (Теоретически вы можете использовать UTF-16 или даже UTF-32, но браузеры не должны их поддерживать.)

Хотя поддержка символов, отличных от BMP, непосредственно в исходных документах является необязательной в соответствии со стандартом ECMAScript, современные браузеры позволяют использовать их. Естественно, вам нужен редактор, который может обрабатывать UTF-8, и вам нужны некоторые методы ввода; см., например, my Полный Unicode Input.

Вопрос содержит некоторые ошибки, которые остались незамеченными: поскольку значения атрибутов id чувствительны к регистру, написание myId должно быть исправлено до myId. И символ OPEN LOCK - U + 1F513, а не U + 1F512, поэтому ссылка &#x1f512; даст неправильный символ.

Кроме того, очень мало шрифтов содержат OPEN LOCK, и браузеры, особенно IE, могут испытывать трудности с поиском глифа, даже если некоторый шрифт в системе содержит его, поэтому вы должны предоставить браузеру помощь и объявить список шрифтов, которые, как известно, содержат характер, в порядке предпочтения. Пример:

<style>
#myID { font-family: Symbola, Quivira, Segoe UI Symbol; }
</style>
<a id="myID">stuff</a>
<script>
 $("#myID").text('🔓');
</script>

Не-BMP-символ внутренне представлен как суррогатная пара, и его можно записать с использованием обозначений \u для компонентов пары, но это очень неинтуитивно.

Ответ 3

отредактирован — Если это кодовая точка Юникода, которая может быть представлена ​​в одном символе UTF-16, тогда в таких ситуациях можно использовать escape-последовательности JavaScript:

$('#foo').text('\uXXXX');

Однако, поскольку ваш персонаж требует больше бит, это не работает. Вероятно, возможно было бы построить последовательность байтов, которая позволила бы символу быть представленным как UTF-16, но это было бы болью. Я бы пошел с .html().

Обратите внимание, что не все шрифты предоставляют глифы для "экзотических" кодовых пунктов, подобных этому, и по моему опыту те, которые действительно обеспечивают невероятно уродливые.

Ответ 4

После script следует преобразовать шестнадцатеричные значения UTF32 в пары UTF16

function toUTF16Pair(hex) {
  hex = hex.replace(/[&#x;]/g,'');
    var x = parseInt(hex, 16);
    if (x >= 0x10000 && x <= 0x10FFFF) {
        var first = Math.floor((x - 0x10000) / 0x400) + 0xD800;
        var second = ((x - 0x10000) % 0x400) + 0xDC00;
        return {
            first: first.toString(16).toUpperCase(),
            second: second.toString(16).toUpperCase(),
          combined: '\\u'+first.toString(16).toUpperCase() + '\\u'+second.toString(16).toUpperCase()
        };
    } else {
        return {}
    }
}
<input type='text' id='in' />
<input type='button' value='Click' onclick="document.getElementById('result').innerHTML = toUTF16Pair(document.getElementById('in').value).combined" />
<p id='result'></p>