Descubrí que tenía problemas con este enfoque, básicamente porque estaba tratando de escribir el resultado en un archivo y no estaba codificado correctamente. Dado que JS parece usar la codificación UCS-2 ( fuente , fuente ), necesitamos ampliar esta solución un paso más, aquí está mi solución mejorada que me funciona.
No tuve dificultades con el texto genérico, pero cuando estaba en árabe o coreano, el archivo de salida no tenía todos los caracteres, sino que mostraba caracteres de error
Archivo de salida:
","10k unit":"",Follow:"Õ©íüY‹","Follow %{screen_name}":"%{screen_name}U“’Õ©íü",Tweet:"ĤüÈ","Tweet %{hashtag}":"%{hashtag} ’ĤüÈY‹","Tweet to %{name}":"%{name}U“xĤüÈY‹"},ko:{"%{followers_count} followers":"%{followers_count}…X \Ì","100K+":"100Ì tÁ","10k unit":"Ì è",Follow:"\°","Follow %{screen_name}":"%{screen_name} Ø \°X0",K:"œ",M:"1Ì",Tweet:"¸","Tweet %{hashtag}":"%{hashtag}
Original:
","10k unit":"万",Follow:"フォローする","Follow %{screen_name}":"%{screen_name}さんをフォロー",Tweet:"ツイート","Tweet %{hashtag}":"%{hashtag} をツイートする","Tweet to %{name}":"%{name}さんへツイートする"},ko:{"%{followers_count} followers":"%{followers_count}명의 팔로워","100K+":"100만 이상","10k unit":"만 단위",Follow:"팔로우","Follow %{screen_name}":"%{screen_name} 님 팔로우하기",K:"천",M:"백만",Tweet:"트윗","Tweet %{hashtag}":"%{hashtag}
Tomé la información de la solución de Dennis y esta publicación que encontré.
Aquí está mi código:
function encode_utf8(s) {
return unescape(encodeURIComponent(s));
}
function decode_utf8(s) {
return decodeURIComponent(escape(s));
}
function ab2str(buf) {
var s = String.fromCharCode.apply(null, new Uint8Array(buf));
return decode_utf8(decode_utf8(s))
}
function str2ab(str) {
var s = encode_utf8(str)
var buf = new ArrayBuffer(s.length);
var bufView = new Uint8Array(buf);
for (var i=0, strLen=s.length; i<strLen; i++) {
bufView[i] = s.charCodeAt(i);
}
return bufView;
}
Esto me permite guardar el contenido en un archivo sin problemas de codificación.
Cómo funciona: Básicamente, toma los fragmentos individuales de 8 bytes que componen un carácter UTF-8 y los guarda como caracteres individuales (por lo tanto, un carácter UTF-8 construido de esta manera, podría estar compuesto por 1-4 de estos caracteres). UTF-8 codifica caracteres en un formato que varía de 1 a 4 bytes de longitud. Lo que hacemos aquí es codificar la picadura en un componente URI y luego tomar este componente y traducirlo en el correspondiente carácter de 8 bytes. De esta forma no perdemos la información dada por los caracteres UTF8 que tienen más de 1 byte de longitud.
Int8Array
ArrayBufferView
, es posible que simplemente puedas usar la notación de corchetes para copiar caracteresstring[i] = buffer[i]
y viceversa.