2014-02-08 5 views
32

Я пытаюсь преобразовать строку юникода в шестнадцатеричное представление в javascript.Javascript: Unicode string to hex

Это то, что у меня есть:

function convertFromHex(hex) { 
    var hex = hex.toString();//force conversion 
    var str = ''; 
    for (var i = 0; i < hex.length; i += 2) 
     str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); 
    return str; 
} 

function convertToHex(str) { 
    var hex = ''; 
    for(var i=0;i<str.length;i++) { 
     hex += ''+str.charCodeAt(i).toString(16); 
    } 
    return hex; 
} 

Но если не будет работать на Юникод, как китайские;

Вход: 漢字

Выход:? ªo "[W

Любые идеи Можно ли это сделать в JavaScript

ответ

68

Помните, что блок кода JavaScript имеет ширину 16 бит Поэтому. шестнадцатеричная строка форма будет 4 цифры на единицу кода

использование:.

var str = "\u6f22\u5b57"; // "\u6f22\u5b57" === "漢字" 
alert(str.hexEncode().hexDecode()); 

Строка шестигранной формы:

String.prototype.hexEncode = function(){ 
    var hex, i; 

    var result = ""; 
    for (i=0; i<this.length; i++) { 
     hex = this.charCodeAt(i).toString(16); 
     result += ("000"+hex).slice(-4); 
    } 

    return result 
} 

Назад снова:

String.prototype.hexDecode = function(){ 
    var j; 
    var hexes = this.match(/.{1,4}/g) || []; 
    var back = ""; 
    for(j = 0; j<hexes.length; j++) { 
     back += String.fromCharCode(parseInt(hexes[j], 16)); 
    } 

    return back; 
} 
+0

Спасибо, только один вопрос, хотя (может быть немой один ..) - как вы получаете \ u6f22 \ u5b57 из 漢字 в javascript? Самое близкое к функции escape(), но это использует% - я предполагаю, что регулярное выражение может быть использовано для замены% с помощью /, но функция escape() также устарела. EncodeURI и encodeURIComponent дают разные результаты. Есть идеи? – Wesley

+1

'' \ u6f22 \ u5b57 "' - это escape-форма Unicode литерала '' 漢字 "' так же, как '\ n' является символом новой строки. Я склонен использовать их, чтобы избежать двусмысленности и избежать проблем с кодировкой символов. Подробнее см. [Спецификация] (http://www.ecma-international.org/publications/standards/Ecma-262.htm). Чтобы сгенерировать их, вы сами меняете вышеуказанный символ '(" 000 "+ hex) .slice (-4)' to '" \\ u "+ (" 000 "+ hex) .slice (-4)'. Выражение '' \ u6f22 \ u5b57 "===" 漢字 "' оценивается как true, поскольку после разбора кода они одинаковы. – McDowell

+0

Спасибо, 1 проблема, с которой я сталкиваюсь, иногда hex.match (//. {1,4}/g); ничего не соответствует. (ошибка: null не является объектом (оценка hexes.length)) - знаете ли вы, что может быть причиной? – Wesley

8

how do you get "\u6f22\u5b57" from 漢字 in JavaScript?

Это JavaScript Unicode escape sequences e.g. \u12AB. Чтобы преобразовать их, вы можете перебирать все единицы кода в строке, называть .toString(16) и идти оттуда.

Однако, более эффективно использовать также выходной сигнал hexadecimal escape sequences e.g. \xAA на выходе.

Также обратите внимание, что символы ASCII, такие как A, b и -, вероятно, не должны быть экранированы.

Я написал небольшую библиотеку JavaScript, которая делает все это для вас, называется jsesc. Он имеет множество опций для управления выходом.

Вот онлайн демо инструмента в действии: http://mothereff.in/js-escapes#1%E6%BC%A2%E5%AD%97


Вашего вопрос был помечен, как utf-8. Чтение остальной части вашего вопроса, кодирование/декодирование UTF-8, похоже, не было тем, что вы хотели здесь, но в случае необходимости: use utf8.js (online demo).

+1

Спасибо за библиотеку! – Wesley

5

Вот твик алгоритма Макдауэлл, который не набивать результат:

function toHex(str) { 
    var result = ''; 
    for (var i=0; i<str.length; i++) { 
     result += str.charCodeAt(i).toString(16); 
    } 
    return result; 
    } 
+3

Зачем вам не нужна панель? теперь шестнадцатеричный вывод неоднозначен – Inverse

8

Это зависит от того, что кодирование используется. Если вы хотите преобразовать UTF-8, закодированный гекс в строку, используйте:

function fromHex(hex,str){ 
    try{ 
    str = decodeURIComponent(hex.replace(/(..)/g,'%$1')) 
    } 
    catch(e){ 
    str = hex 
    console.log('invalid hex input: ' + hex) 
    } 
    return str 
} 

Для другого использования направления это:

function toHex(str,hex){ 
    try{ 
    hex = unescape(encodeURIComponent(str)) 
    .split('').map(function(v){ 
     return v.charCodeAt(0).toString(16) 
    }).join('') 
    } 
    catch(e){ 
    hex = str 
    console.log('invalid text input: ' + str) 
    } 
    return hex 
}