Javascript: chaîne Unicode hexadécimal

j'essaie de convertir une chaîne unicode en représentation hexadécimale en javascript.

voici ce que j'ai:

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;
}

Mais si échoue sur unicode des caractères chinois;

Entrée: 漢字

Sortie: ªo"[W

des idées? Cela peut être fait en javascript?

36
demandé sur Wesley 2014-02-08 19:35:31

4 réponses

rappelez-vous qu'une unité de code JavaScript a une largeur de 16 bits. Par conséquent la forme de chaîne de caractères hexadécimaux sera de 4 chiffres Par unité de code.

utilisation:

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

Chaîne à l'hex de la forme:

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
}

une fois de plus:

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;
}
70
répondu McDowell 2015-02-11 12:33:20

cela dépend du codage que vous utilisez. Si vous voulez convertir un hexadécimal encodé utf-8 en chaîne de caractères, Utilisez ceci:

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

Pour l'autre direction utiliser ceci:

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
}
9
répondu Pavel Gatnar 2015-09-02 19:57:46

comment obtenez-vous "\u6f22\u5b57"漢字 en JavaScript?

Ces JavaScript séquences D'échappement Unicode, p.ex.\u12AB. Pour les convertir, Vous pouvez itérer sur chaque unité de code dans la chaîne, appeler .toString(16) sur elle, et à partir de là.

Toutefois, il est plus efficace d'utiliser séquences hexadécimales d'échappement, p.ex.\xAA dans la sortie lorsque c'est possible.

notez aussi que les symboles ASCII A,b et - probablement pas besoin de s'échapper.

j'ai écrit une petite bibliothèque JavaScript qui fait tout cela pour vous, appelé jsesc. Il a beaucoup d'options pour contrôler la sortie.

Voici une démonstration en ligne de l'outil en action: http://mothereff.in/js-escapes#1%E6%BC%A2%E5%AD%97


votre question a été marquée comme utf-8. En lisant le reste de votre question, L'encodage/décodage UTF-8 ne semblait pas être ce que vous vouliez ici, mais au cas où vous en auriez besoin:utiliser utf8.js ( démonstration en ligne).

8
répondu Mathias Bynens 2017-06-19 06:40:28

Voici une modification de L'algorithme de McDowell qui ne modifie pas le résultat:

  function toHex(str) {
    var result = '';
    for (var i=0; i<str.length; i++) {
      result += str.charCodeAt(i).toString(16);
    }
    return result;
  }
6
répondu redgeoff 2014-10-15 05:58:39