2015-02-11 1 views
0

У меня проблема с bizzaire, и я просмотрел все подобные вопросы и до сих пор не смог ее решить. Я дешифрую сообщение электронной почты MIME в javascript и вижу = C2 = A3, что означает два символа 0xC2 и 0xA2, чтобы сделать знак британского фунта UTF-8.Отображение UTF-8 в Javascript Сгенерированный HTML (например, знак фунта)

Я установил meta charset = UTF-8 в документе, но он все еще не отображается как знак фунта в визуализированном html-документе. Страница Info сообщает, что страница отображается как UTF-8 ... если это так, почему не знак фунта и nbsp отображаются правильно?

Я использую следующий код, чтобы декодировать строку:

s.replace(/=[\r\n]+/g, "").replace(/=[0-9A-F]{2}/gi, function(v) { 
    return String.fromCharCode(parseInt(v.substr(1), 16)); 
}) 
+0

Я использую следующий код для декодирования строки s: 's.replace (/ = [\ r \ n] +/g, "") .replace (/ = [0-9A-F] {2}/gi, function (v) { return String.fromCharCode (parseInt (v.substr (1)), 16)); }); ' – user3780104

+0

Да, это слишком упрощенно. Байты 'C2 A3' * вместе * образуют один символ Юникода, закодированный в UTF-8; 'String.fromCharCode' ожидает, что одна кодовая точка Unicode генерирует один символ. Выполнение двух отдельных байтов в строке не будет делать этого. Вы должны знать особенности кодирования UTF-8 при декодировании этого текста, чтобы убедиться, что вы декодируете '= C2 = A3' вместе в одно число, которое вы передаете' String.fromCharCode'. Это может быть довольно немного кода, я ожидаю, что там будут библиотеки, уже доступные для таких вещей. – deceze

+0

gotcha благодарит за вашу помощь - вы только что разрешили работу в течение нескольких дней! – user3780104

ответ

0

код декодирования здесь:

https://gist.github.com/boushley/5471599

Последовательность байтов необходимо правильно декодировать в UTF8.

+0

Пожалуйста, разместите здесь код для потомков, ссылки имеют тенденцию гнить. Может быть, полное решение от MIME-текста до символов для дополнительных очков. ;) – deceze

+0

Я добавил этот код в качестве полного автономного ответа здесь ... – deceze

0

Это слишком упрощен алгоритм декодирования. Байты C2 A3вместе образуют один символ Юникода, кодированный в UTF-8; String.fromCharCode ожидает, что один код кода Unicode будет генерировать один символ. Выполнение двух отдельных байтов в строке не будет делать этого. Вы должны будете знать специфику кодирования UTF-8 при декодировании этого текста, чтобы убедиться, что вы декодируете =C2=A3 вместе в одно число, которое вы передаете String.fromCharCode. Это может быть довольно немного кода, я ожидаю, что там будут библиотеки, уже доступные для таких вещей.

Например, см этот код из here (размещение, что вы нашли здесь для потомков):

function decodeUtf8(arrayBuffer) { 
    var result = ""; 
    var i = 0; 
    var c = 0; 
    var c1 = 0; 
    var c2 = 0; 

    var data = new Uint8Array(arrayBuffer); 

    // If we have a BOM skip it 
    if (data.length >= 3 && data[0] === 0xef && data[1] === 0xbb && data[2] === 0xbf) { 
    i = 3; 
    } 

    while (i < data.length) { 
    c = data[i]; 

    if (c < 128) { 
     result += String.fromCharCode(c); 
     i++; 
    } else if (c > 191 && c < 224) { 
     if(i+1 >= data.length) { 
     throw "UTF-8 Decode failed. Two byte character was truncated."; 
     } 
     c2 = data[i+1]; 
     result += String.fromCharCode(((c&31)<<6) | (c2&63)); 
     i += 2; 
    } else { 
     if (i+2 >= data.length) { 
     throw "UTF-8 Decode failed. Multi byte character was truncated."; 
     } 
     c2 = data[i+1]; 
     c3 = data[i+2]; 
     result += String.fromCharCode(((c&15)<<12) | ((c2&63)<<6) | (c3&63)); 
     i += 3; 
    } 
    } 
    return result; 
}