如何使用JavaScript/jQuery从HTML中获取符号的Unicode/十六进制表示?

26

假设我有这样一个元素...

<math xmlns="http://www.w3.org/1998/Math/MathML">
  <mo class="symbol">α</mo>
</math>

有没有一种方法可以使用JavaScript/jQuery获取alpha字符 α 的unicode/hex值,类似于&#x03B1这样的形式?

$('.symbol').text().unicode(); // I know unicode() doesn't exist
$('.symbol').text().hex(); // I know hex() doesn't exist

我需要使用&#x03B1代替α,但似乎每当我将&#x03B1插入DOM并立即尝试检索它时,它会被呈现出来,我无法得到&#x03B1;我只得到 α。

4个回答

31

使用大部分纯 JavaScript,你应该能够做到:

function entityForSymbolInContainer(selector) {
    var code = $(selector).text().charCodeAt(0);
    var codeHex = code.toString(16).toUpperCase();
    while (codeHex.length < 4) {
        codeHex = "0" + codeHex;
    }

    return "&#x" + codeHex + ";";
}

以下是一个例子:http://jsfiddle.net/btWur/


@aroth... 这看起来很棒!我正在测试。 - Hristo

22

charCodeAt可以获取字符串的十进制值:

"α".charCodeAt(0); //returns 945
0x03b1 === 945; //returns true

toString会得到十六进制字符串

(945).toString(16); // returns "3b1"

(已确认在IE9和Chrome中可用)


17
如果您尝试以上述方式转换BMP(基本多语言平面)之外的Unicode字符,您将会遇到一个不愉快的惊喜。BMP之外的字符被编码为多个UTF16值,例如:""。length = 2(一部分用于扣环,一部分用于锁底)。

因此,"".charCodeAt(0)将给您55357,这只是数字的“一半”,而"".charCodeAt(1)将给您56594,这是另一半。

要获取这些值的字符代码,您可以使用以下字符串扩展函数。

String.prototype.charCodeUTF32 = function(){   
    return ((((this.charCodeAt(0)-0xD800)*0x400) + (this.charCodeAt(1)-0xDC00) + 0x10000));
};

你也可以像这样使用它

"&#x"+("".charCodeUTF32()).toString(16)+";"

获取HTML十六进制代码。

希望这可以节省您一些时间。


1
+1 感谢您拯救我们脱离这个地雷!对字符长度进行检查是我成功的关键。 - L0j1k
很好的见解,注意不仅仅是表情符号超出了BMP :) 你的原型增强应该先检查长度;对于“UTF-8”字符串,this.charCodeAt(1)将返回NaN,因此整个函数也会受到影响;对于“长度为2”的字符,它应该只返回charCodeAt(0) - kontur

0

举个例子,如果您需要将这个十六进制代码转换为 Unicode

e68891e4bda0e4bb96

  1. 逐个挑选两个字符,
  2. 如果十进制 ASCII 码超过 127,则在前面添加 % 符号
  3. 返回 URL 解码字符串

    function hex2a(hex) { var str = ''; for (var i = 0; i < hex.length; i += 2){

        var dec = parseInt(hex.substr(i, 2), 16);
        character = String.fromCharCode(dec);
    
    
        if (dec > 127)
            character = "%"+hex.substr(i,2);
    
        str += character;
    
    }
    
    return decodeURI(str);
    

    }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接