Eu descobri que tinha problemas com essa abordagem, basicamente porque estava tentando gravar a saída em um arquivo e ele não estava codificado corretamente. Como o JS parece usar a codificação UCS-2 ( origem , origem ), precisamos estender mais esta solução, aqui está minha solução aprimorada que funciona para mim.
Não tive dificuldades com o texto genérico, mas quando se tratava de árabe ou coreano, o arquivo de saída não tinha todos os caracteres, mas exibia caracteres de erro
Saída do arquivo:
","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}
Peguei as informações da solução de dennis e encontrei este post .
Aqui está o meu 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;
}
Isso me permite salvar o conteúdo em um arquivo sem problemas de codificação.
Como funciona: Basicamente, pega os pedaços de 8 bytes que compõem um caractere UTF-8 e os salva como caracteres únicos (portanto, um caractere UTF-8 construído dessa maneira pode ser composto por 1 a 4 desses caracteres). UTF-8 codifica caracteres em um formato que varia de 1 a 4 bytes de comprimento. O que fazemos aqui é codificar a picada em um componente URI e, em seguida, pegar esse componente e convertê-lo no caractere de 8 bytes correspondente. Dessa forma, não perdemos as informações fornecidas pelos caracteres UTF8 com mais de 1 byte de comprimento.
Int8Array
ArrayBufferView
, pode ser possível simplesmente usar a notação entre colchetes para copiar caracteresstring[i] = buffer[i]
e vice-versa.