JavaScript中字符转十六进制

19
有谁能指导我如何在JavaScript中将字符转换为十六进制?例如:

"入力されたデータは範囲外です。"
转换为
"\u5165\u529B\u3055\u308C\u305F\u30C7\u30FC\u30BF\u306F\u7BC4\u56F2\u5916\u3067\u3059\u3002"

这个网站可以实现

但我无法想出解决方法。

有什么建议吗?

谢谢,Sarbbottam

4个回答

31

你可以通过循环字符并使用 charCodeAt 函数获取它们的 UTF-16 值,然后使用这些值构造一个字符串。

以下是我编写的比你提供的代码更好的代码,应该更易于理解:

function string_as_unicode_escape(input) {
    function pad_four(input) {
        var l = input.length;
        if (l == 0) return '0000';
        if (l == 1) return '000' + input;
        if (l == 2) return '00' + input;
        if (l == 3) return '0' + input;
        return input;
    }
    var output = '';
    for (var i = 0, l = input.length; i < l; i++)
        output += '\\u' + pad_four(input.charCodeAt(i).toString(16));
    return output;
}

让我们分解一下。

  1. string_as_unicode_escape 接收一个名为 input 的字符串参数。
  2. pad_four 是一个内部函数,其功能是将字符串填充为至少四个字符长度的字符串,填充字符为前导的 '0'
  3. 首先将 output 定义为空字符串。
  4. 对于字符串中的每个字符,在 output 字符串中追加 \u。使用 input.charCodeAt(i) 获取字符的 UTF-16 值,然后使用 .toString(16) 将其转换为十六进制字符串,并用前导零填充,最后将结果追加到 output 字符串中。
  5. 返回 output 字符串。

正如 Tim Down 所评论的那样,我们还可以在 charCodeAt 值上添加 0x10000 然后调用 .toString(16) 生成的字符串上调用 .slice(1) 方法来实现填充效果。


非常感谢。- Sarbbottam - user626818
5
你可以使用以下技巧来省略填充代码:output += '\\u' + (input.charCodeAt(i) + 0x10000).toString(16).slice(1); - Tim Down
那确实非常聪明;) - Delan Azabani

5
function string_as_unicode_escape(str){
    return str.split("").map(function(s){
        return "\\u"+("0000" + s.charCodeAt(0).toString(16)).slice(-4);
    }).join("");
}

0

var hex = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');

变量 hex 是一个包含十六进制数字字符的数组。

    function stringEncode()
    {
        var x=document.getElementById("from_text");


        var preescape="" + x.value;
        var escaped="";

        var i=0;
        for(i=0;i<preescape.length;i++)
        {
            escaped=escaped+encodeChar(preescape.charAt(i));
        }

        //x=document.getElementById("to_text");

                    x.value=escaped;
        //alert("Codigo: "+escapeHtml(escaped));
        //document.getElementById('string_example').innerHTML="<b>String example with text</b><br/><br/>String s=\""+escapeHtml(escaped)+"\";<br/><br/>";
    }


    function escapeHtml(unsafe) {
       return unsafe
                .replace(/&/g, "&amp;")
                .replace(/</g, "&lt;")
                .replace(/>/g, "&gt;")
                .replace(/"/g, "&quot;")
                .replace(/'/g, "&#039;");
            }

            function encodeChar(original)
            {
                    var found=true;
                    var thecharchar=original.charAt(0);
                    var thechar=original.charCodeAt(0);
                    switch(thecharchar) {
                                    case '\n': return "\\n"; break; //newline
                                    case '\r': return "\\r"; break; //Carriage return
                                    case '\'': return "\\'"; break;
                                    case '"': return "\\\""; break;
                                    case '\\': return "\\\\"; break;
                                    case '\t': return "\\t"; break;
                                    case '\b': return "\\b"; break;
                                    case '\f': return "\\f"; break;

                                    default:
                                            found=false;
                                            break;
                            }
                            if(!found)
                            {
                                    if(thechar>127) {
                                            var c=thechar;
                                            var a4=c%16;
                                            c=Math.floor(c/16); 
                                            var a3=c%16;
                                            c=Math.floor(c/16);
                                            var a2=c%16;
                                            c=Math.floor(c/16);
                                            var a1=c%16;
                                    //  alert(a1);
                                            return "\\u"+hex[a1]+hex[a2]+hex[a3]+hex[a4]+"";        
                                    }
                                    else
                                    {
                                            return original;
                                    }
                            }


            }

//------------------------ 你可以称之为


0
你可以使用普通的 replace() 来实现这个功能。
'! \u0100 力 '.replace(
    /[^\x00-\xFF]/g,
    function(ch) {
        return ('\\u0' + ch.charCodeAt(0).toString(16))
            .replace(/0(?=....$)/, '');
    }
)

生成 ! \u0100 \u529b \ud83d\ude03

非常简洁,处理填充问题不需要繁琐的if或缓慢的slice()
map()不同,可以在所有浏览器中工作(链接1)
请注意,它仅替换您需要的字符(!未被触及),而无需繁琐的迭代或缓慢的split()
就像其他答案一样,它还正确处理代理对(转换为两个字节\ud83d\ude03)。

将其放入自己的函数中并保持两个正则表达式静态,如果您计划多次重复使用该函数,则可以使其更快。

如果您确实需要所有字符,则可以通过将[^\x00-\xFF]更改为.,将\\u0更改为\\u000,将/0(更改为/0+(来完成。


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