David
En este momento tengo una gran cadena de JavaScript que intento escribir en un archivo, pero en una codificación diferente (ISO-8859-1). Esperaba usar algo como descargar. Downloadify solo acepta cadenas JavaScript normales o cadenas codificadas en base64.
Debido a esto, he decidido comprimir mi cadena usando JSZip que genera una cadena codificada en base64 muy bien que se puede pasar para descargar y descargar a mi escritorio. ¡Hurra! El problema es que la cadena que comprimí, por supuesto, todavía tiene la codificación incorrecta.
Afortunadamente, JSZip puede tomar un Uint8Array como datos, en lugar de una cadena. Entonces, ¿hay alguna forma de convertir una cadena JavaScript en una cadena codificada ISO-8859-1 y almacenarla en un Uint8Array?
Alternativamente, si me estoy acercando a esto todo mal, ¿hay una solución mejor en conjunto? ¿Existe una clase de cadena de JavaScript elegante que pueda usar diferentes codificaciones internas?
Editar: para aclarar, no estoy enviando esta cadena a una página web, por lo que no la convertirá automáticamente. Estoy haciendo algo como esto:
var zip = new JSZip();
zip.file("genSave.txt", result);
return zip.generate({compression:"DEFLATE"});
Y para que esto tenga sentido, necesitaría que el resultado esté en la codificación adecuada (y JSZip solo toma cadenas, arraybuffers o uint8arrays).
Edición final (Esta no era una pregunta duplicada porque el resultado no se mostraba en el navegador ni se transmitía a un servidor donde se podía cambiar la codificación):
Esto resultó ser un poco más oscuro de lo que había pensado, así que terminé lanzando mi propia solución. No es tan robusto como lo sería una solución adecuada, pero convertirá una cadena de JavaScript en codificación de Windows-1252 y la pegará en un Uint8Array:
var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a Uint8Array
Luego puede usarlo en la matriz como lo hice yo:
//Make this into a zip
var zip = new JSZip();
zip.file("genSave.txt", tenc);
return zip.generate({compression:"DEFLATE"});
O conviértalo en una cadena codificada de Windows-1252 usando esta biblioteca de codificación de cadenas:
var string = TextDecoder("windows-1252").decode(tenc);
Para usar esta función, use:
<script src="https://www.eu4editor.com/string_transcoder.js"></script>
O incluye esto:
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}
};
Esto resultó ser un poco más oscuro que [the author] había pensado, entonces [the author] terminó rodando [his] solución propia. No es tan robusto como lo sería una solución adecuada, pero convertirá una cadena de JavaScript en codificación de Windows-1252 y la pegará en un Uint8Array:
var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a Uint8Array
Luego puede usarlo en la matriz como [the author] hizo:
//Make this into a zip
var zip = new JSZip();
zip.file("genSave.txt", tenc);
return zip.generate({compression:"DEFLATE"});
O conviértalo en una cadena codificada de Windows-1252 usando esta biblioteca de codificación de cadenas:
var string = TextDecoder("windows-1252").decode(tenc);
Para usar esta función, use:
<script src="https://www.eu4editor.com/string_transcoder.js"></script>
O incluye esto:
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}
};
-
¡Gracias! 🙂 Da la casualidad de que esta es la primera solución que pude encontrar para el problema de codificar la descripción de estado HTTP en NetFramework: Response.StatusDescription codificada en CP1252 y mi navegador siempre intenta decodificarla como CP1251.
– órnico
31 de enero de 2022 a las 14:28
-
el vinculado code.google.com/p/stringencodificación La biblioteca anterior ya no existe. Pero esta respuesta de otra publicación stackoverflow.com/a/54883467/1915920 ayuda y puede relacionarse con su sucesor: github.com/inexorabletash/text-encoding
– Andreas Covidiot
28 de septiembre de 2022 a las 7:13
usuario2511140
Pruebe el siguiente script:
<script type="text/javascript" charset="utf-8">
-
No, esto no se aplica. Todo esto fue una codificación interna de cadenas de javascript (no literales y no formateadas por el navegador).
– David
26/10/2013 a las 20:44
La mejor solución para mí se publicó aquí y esta es mi única línea:
<!-- Required for non-UTF encodings (quite big) -->
<script src="encoding-indexes.js"></script>
<script src="encoding.js"></script>
...
// windows-1252 is just one typical example encoding/transcoding
let transcodedString = new TextDecoder( 'windows-1252' ).decode(
new TextEncoder().encode( someUtf8String ))
o esto si la transcodificación debe aplicarse en múltiples entradas reutilizando el codificador y el decodificador:
let srcArr = [ ... ] // some UTF-8 string array
let encoder = new TextEncoder()
let decoder = new TextDecoder( 'windows-1252' )
let transcodedArr = srcArr.forEach( (s,i) => {
srcArr[i] = decoder.decode( encoder.encode( s )) })
(La otra respuesta ligeramente modificada de la pregunta relacionada 🙂
Esto es lo que encontré después de una búsqueda en Google más específica que solo la codificación/descodificación UTF-8. entonces, para aquellos que buscan una biblioteca de conversión para convertir entre codificaciones, aquí tienen.
github.com/inexorabletash/text-encoding
var uint8array = new TextEncoder().encode(str); var str = new TextDecoder(encoding).decode(uint8array);
Pegar desde el archivo Léame del repositorio
Se admiten todas las codificaciones de la especificación de codificación:
utf-8 ibm866 iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 iso-8859-6
iso-8859-7 iso-8859-8 iso-8859-8-i iso-8859-10 iso-8859-13 iso-8859-14
iso-8859-15 iso-8859-16 koi8-r koi8-u macintosh windows-874 windows-1250
windows-1251 windows-1252 windows-1253 windows-1254 windows-1255
windows-1256 windows-1257 windows-1258 x-mac-cyrillic gb18030 hz-gb-2312
big5 euc-jp iso-2022-jp shift_jis euc-kr replacement utf-16be utf-16le
x-user-defined
(Algunas codificaciones pueden admitirse con otros nombres, p.
ascii
,
iso-8859-1
etc. Consulte Codificación para obtener etiquetas adicionales para cada codificación).
¿No sería algo como
utfstring = unescape(encodeURIComponent(originalstring));
¿trabajar?– Joren
18/09/2013 a las 18:44
Lamentablemente no. Mi objetivo es ver ‘Île’ al ver el archivo final como ISO-8859-1. Cuando se escribe el archivo, normalmente se escribe como UCS-2, lo que da como resultado ‘ÃŽle’ cuando se ve como ISO-8859-1. Al usar su método, da como resultado ‘Île’. Este no es el mismo problema que el duplicado propuesto, ya que no le estoy pidiendo al navegador que muestre esto y, por lo tanto, cambiar la metaetiqueta HTML5 no resolverá el problema.
– David
18/09/2013 a las 19:05
¿Respondiste tu propia pregunta? ¿O me estoy perdiendo algo?
– Enigmadan
18/09/2013 a las 22:31
Si, lo hice. Se cerró incorrectamente como un duplicado y no quería dejarlo colgado sin respuesta.
– David
18 de septiembre de 2013 a las 23:08
@David: si esa edición fue una respuesta, retírela y publíquela como una respuesta automática (que puede aceptar entonces)
– Bergi
18/09/2013 a las 23:55