2017-09-13 4 views
0

J'essaye de convertir un texte en caractères hexadécimaux afin de construire un dmg sur mac. Je suis brûlé par le fait que les hexadécimaux ne semblent pas faire référence aux mêmes caractères sur mac et windows pour les caractères ascii> 127. Et il semble que les fonctions javascript de base ne donnent que la traduction "windows".
J'ai besoin "mac" la traduction en hexadécimal ...Conversion de texte en hexadécimal sur mac

Je fais cela jusqu'à présent:

const fileData = await parseJson(readFile(item.file, "utf-8")) 
const buttonsStr = labelToHex(fileData.lang) 

function labelToHex(label: string) { 
    return hexEncode(label).toString().toUpperCase() 
} 

function hexEncode(str: string) { 
    let i 
    let result = "" 

    for (i = 0; i < str.length; i++) { 
    result += unicodeToHex(str.charCodeAt(i)) 
    } 

    return result 
} 

function unicodeToHex(unicode: number) { 
    const hex = unicode.toString(16) 
    return ("0" + hex).slice(-2) 
} 

Si je passe: Français EAE
Je reçois: 46 72 61 61 69 6E e7 73 E9 e0 e8
mais quand je relis, je reçois: FranÁais ‡ Ë
é Je me attends à g et: 46 72 61 6E 8d 61 69 73 8E 88 8f
de telle sorte que la lecture en arrière donne: 46 72 61 6E e7 61 69 73 e9 e0 e8

Ceci correspond à ces feuilles:
https://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ext-mac.htm Néanmoins, je n'ai pas réussi à trouver un paquet npm qui se traduirait par un hexagone basé sur le système d'exploitation ou juste une fonction js obscure que je n'ai toujours pas trouvée.
Je suis à court d'idées et sur le point de le faire:

function unicodeToHex(unicode: number) { 
    if (unicode < 128) { 
    const hex = unicode.toString(16) 
    return ("0" + hex).slice(-2) 
    } 

    if (unicode === 233) { return "8E" }//é 
    if (unicode === 224) { return "88" }//à 
    if (unicode === 232) { return "8F" }//è 

    return "3F" //? 
} 

mais je voudrais vraiment éviter que ...

+0

charCodeAt renvoie une valeur unicode, c'est beaucoup plus que votre taille de 1 octet implique. Si vous voulez juste les valeurs hexadécimales d'une chaîne dans le noeud ,. essayez ceci -> 'Buffer nouveau ('Français éàè'). toString ('hex')' = '4672616ec3a761697320c3a9c3a0c3a8', c'est-à-dire 16 octets, pour vous 11 chaîne de caractères. – Keith

+0

cela semble logique, mais ça ne marche toujours pas dans mon dmg .. Je reçois des ordures au lieu d'éàè: √ß√˘ß © ß®_ Ce qui me fait penser que c'est peut-être parce que le dmg ne sait pas que c'est utf8 ? – ether

+1

'dmg ne sait pas c'est utf8' Très possible, .. Si oui, il existe des outils pour convertir utf8 en une page de code sélectionnée, .. Donc, si vous pouvez savoir quels fichiers dmg page de code utilisent, vous pouvez utiliser quelque chose comme -> https://www.npmjs.com/package/codepage – Keith

Répondre

0

J'ai trouvé un moyen de le faire, grâce à la pages de codes, comme indiqué par @Keith

const cptable = require("codepage") 
function hexEncode(str: string, lang: string, langWithRegion: string) { 
    let code 
    let hex 
    let i 
    const macCodePages = getMacCodePage(lang, langWithRegion) 
    let result = "" 

    for (i = 0; i < str.length; i++) { 
    try { 
     code = getMacCharCode(str, i, macCodePages) 
     if (code === undefined) { 
     hex = "3F" //? 
     } else { 
     hex = code.toString(16) 
     } 

     result += hex 
    } catch (e) { 
     debug("there was a problem while trying to convert a char to hex: " + e) 
     result += "3F" //? 
    } 
    } 

    return result 
} 

function getMacCodePage(lang: string, langWithRegion: string) { 
    switch (lang) { 
    case "ja": //japanese 
     return [10001] //Apple Japanese 
    case "zh": //chinese 
     if (langWithRegion === "zh_CN") { 
     return [10008] //Apple Simplified Chinese (GB 2312) 
     } 
     return [10002] //Apple Traditional Chinese (Big5) 
    case "ko": //korean 
     return [10003] //Apple Korean 
    case "ar": //arabic 
    case "ur": //urdu 
     return [10004] //Apple Arabic 
    case "he": //hebrew 
     return [10005] //Apple Hebrew 
    case "el": //greek 
    case "elc": //greek 
     return [10006] //Apple Greek 
    case "ru": //russian 
    case "be": //belarussian 
    case "sr": //serbian 
    case "bg": //bulgarian 
    case "uz": //uzbek 
     return [10007] //Apple Macintosh Cyrillic 
    case "ro": //romanian 
     return [10010] //Apple Romanian 
    case "uk": //ukrainian 
     return [10017] //Apple Ukrainian 
    case "th": //thai 
     return [10021] //Apple Thai 
    case "et": //estonian 
    case "lt": //lithuanian 
    case "lv": //latvian 
    case "pl": //polish 
    case "hu": //hungarian 
    case "cs": //czech 
    case "sk": //slovak 
     return [10029] //Apple Macintosh Central Europe 
    case "is": //icelandic 
    case "fo": //faroese 
     return [10079] //Apple Icelandic 
    case "tr": //turkish 
     return [10081] //Apple Turkish 
    case "hr": //croatian 
    case "sl": //slovenian 
     return [10082] //Apple Croatian 
    default: 
     return [10000] //Apple Macintosh Roman 
    } 
} 

function getMacCharCode(str: string, i: number, macCodePages: any) { 
    let code = str.charCodeAt(i) 
    let j 
    if (code < 128) { 
    code = str.charCodeAt(i) 
    } 
    else if (code < 256) { 
    //codepage 10000 = mac OS Roman 
    code = cptable[10000].enc[str[i]] 
    } 
    else { 
    for (j = 0; j < macCodePages.length; j++) { 
     code = cptable[macCodePages[j]].enc[str[i]] 
     if (code !== undefined) { 
     break 
     } 
    } 
    } 

    return code 
}