2013-09-18 2 views
16

На данный момент у меня есть большая строка JavaScript, которую я пытаюсь записать в файл, но в другой кодировке (ISO-8859-1). Я надеялся использовать что-то вроде downloadify. Downloadify принимает только обычные строки JavaScript или строки с кодировкой base64.Изменение кодировки строки JavaScript

Из-за этого я решил сжать свою строку, используя JSZip, которая генерирует красивую строчную кодировку base64, которая может быть передана для загрузки и загружена на рабочий стол. Ура! Проблема в том, что сжатая строка, конечно же, по-прежнему является неправильной кодировкой.

К счастью, JSZip может использовать Uint8Array в качестве данных вместо строки. Итак, есть ли способ конвертировать строку JavaScript в кодированную строку ISO-8859-1 и хранить ее в Uint8Array?

В качестве альтернативы, если я подхожу к этому, все неправильно, есть ли лучшее решение для всех вместе? Есть ли фантастический стиль строки JavaScript, который может использовать разные внутренние кодировки?

Редактировать: Чтобы уточнить, я не нажимаю эту строку на веб-страницу, поэтому она автоматически не преобразует ее для меня. Я делаю что-то вроде этого:

var zip = new JSZip(); 
zip.file("genSave.txt", result); 

return zip.generate({compression:"DEFLATE"}); 

И для этого, чтобы иметь смысл, я должен был бы результат, чтобы быть в правильной кодировке (и JSZip принимает только строки, arraybuffers или uint8arrays).

Final Edit (Это было -not- дубликатом вопрос, потому что результат не отображается в браузере или передаются на сервер, где кодирование может быть изменен):

Это оказалось немного более неясным, чем я думал, поэтому я закончил свое собственное решение. Это не так надежен, как и правильное решение будет, но он будет преобразовать строку JavaScript в кодировке Windows-1252, и вставить его в Uint8Array:

var enc = new string_transcoder("windows-1252"); 
var tenc = enc.transcode(result); //This is now a Uint8Array 

Вы можете либо использовать его в массиве, как Я сделал:

//Make this into a zip 
var zip = new JSZip(); 
zip.file("genSave.txt", tenc); 
return zip.generate({compression:"DEFLATE"}); 

Или превратить его в Windows-1252 закодированной строки с помощью this string encoding library:

var string = TextDecoder("windows-1252").decode(tenc); 

Чтобы использовать эту функцию, либо использовать:

<script src="//www.eu4editor.com/string_transcoder.js"></script> 

Или включают следующее:

function string_transcoder (target) { 

    this.encodeList = encodings[target]; 
    if (this.encodeList === undefined) { 
     return undefined; 
    } 

    //Initialize the easy encodings 
    if (target === "windows-1252") { 
     var i; 
     for (i = 0x0; i <= 0x7F; i++) { 
      this.encodeList[i] = i;   
     } 
     for (i = 0xA0; i <= 0xFF; i++) { 
      this.encodeList[i] = i; 
     } 
    } 

} 

string_transcoder.prototype.transcode = function (inString) { 


    var res = new Uint8Array(inString.length), i; 


    for (i = 0; i < inString.length; i++) { 
     var temp = inString.charCodeAt(i); 
     var tempEncode = (this.encodeList)[temp]; 
     if (tempEncode === undefined) { 
      return undefined; //This encoding is messed up 
     } else { 
      res[i] = tempEncode; 
     } 
    } 

    return res; 
}; 

encodings = { 

    "windows-1252": {0x20AC:0x80, 0x201A:0x82, 0x0192:0x83, 0x201E:0x84, 0x2026:0x85, 0x2020:0x86, 0x2021:0x87, 0x02C6:0x88, 0x2030:0x89, 0x0160:0x8A, 0x2039:0x8B, 0x0152:0x8C, 0x017D:0x8E, 0x2018:0x91, 0x2019:0x92, 0x201C:0x93, 0x201D:0x94, 0x2022:0x95, 0x2013:0x96, 0x2014:0x97, 0x02DC:0x98, 0x2122:0x99, 0x0161:0x9A, 0x203A:0x9B, 0x0153:0x9C, 0x017E:0x9E, 0x0178:0x9F}  

}; 
+0

Не был бы что-то вроде 'utfstring = (encodeURIComponent экранирования в (originalstring));' работы? – Joren

+1

К сожалению, нет. Моя цель - увидеть «Île» при просмотре финального файла как ISO-8859-1. При записи файла обычно он записывается как UCS-2, что приводит к «ÃŽle», если смотреть как ISO-8859-1. При использовании вашего метода это приводит к «ÃƒÂŽle». Это не та же проблема, что и предлагаемый дубликат, поскольку я не прошу браузер отображать это, и поэтому изменение метатега HTML5 не решит проблему. – David

+0

Вы ответили на свой вопрос? или я что-то упускаю? – Enigmadan

ответ

3

Это оказалось немного более неясными, чем [автор] думал, так что [автор] в конечном итоге прокатки [его] собственное решение.Это не так надежен, как и правильное решение будет, но он будет преобразовать строку JavaScript в кодировке Windows-1252, и вставить его в Uint8Array:

var enc = new string_transcoder("windows-1252"); 
var tenc = enc.transcode(result); //This is now a Uint8Array 

Вы можете либо использовать его в массиве, как [автор] сделал:

//Make this into a zip 
var zip = new JSZip(); 
zip.file("genSave.txt", tenc); 
return zip.generate({compression:"DEFLATE"}); 

Или превратить его в Windows-1252 закодированной строки, используя this string encoding library:

var string = TextDecoder("windows-1252").decode(tenc); 

Чтобы использовать эту функцию, либо использовать:

<script src="//www.eu4editor.com/string_transcoder.js"></script> 

Или включают следующее:

function string_transcoder (target) { 

    this.encodeList = encodings[target]; 
    if (this.encodeList === undefined) { 
     return undefined; 
    } 

    //Initialize the easy encodings 
    if (target === "windows-1252") { 
     var i; 
     for (i = 0x0; i <= 0x7F; i++) { 
      this.encodeList[i] = i;   
     } 
     for (i = 0xA0; i <= 0xFF; i++) { 
      this.encodeList[i] = i; 
     } 
    } 

} 

string_transcoder.prototype.transcode = function (inString) { 


    var res = new Uint8Array(inString.length), i; 


    for (i = 0; i < inString.length; i++) { 
     var temp = inString.charCodeAt(i); 
     var tempEncode = (this.encodeList)[temp]; 
     if (tempEncode === undefined) { 
      return undefined; //This encoding is messed up 
     } else { 
      res[i] = tempEncode; 
     } 
    } 

    return res; 
}; 

encodings = { 

    "windows-1252": {0x20AC:0x80, 0x201A:0x82, 0x0192:0x83, 0x201E:0x84, 0x2026:0x85, 0x2020:0x86, 0x2021:0x87, 0x02C6:0x88, 0x2030:0x89, 0x0160:0x8A, 0x2039:0x8B, 0x0152:0x8C, 0x017D:0x8E, 0x2018:0x91, 0x2019:0x92, 0x201C:0x93, 0x201D:0x94, 0x2022:0x95, 0x2013:0x96, 0x2014:0x97, 0x02DC:0x98, 0x2122:0x99, 0x0161:0x9A, 0x203A:0x9B, 0x0153:0x9C, 0x017E:0x9E, 0x0178:0x9F}  

}; 
1

тест следующий сценарий:

<script type="text/javascript" charset="utf-8"> 
+0

Нет, это не относится. Это была внутренняя кодировка строки javascript (не литералов и не отформатирована браузером). – David

Смежные вопросы