Odkryłem, że mam problemy z tym podejściem, głównie dlatego, że próbowałem zapisać dane wyjściowe do pliku, który nie został poprawnie zakodowany. Ponieważ wydaje się, że JS używa kodowania UCS-2 ( źródło , źródło ), musimy rozszerzyć to rozwiązanie o krok dalej, oto moje ulepszone rozwiązanie, które działa na mnie.
Nie miałem żadnych problemów z ogólnym tekstem, ale kiedy był to arabski lub koreański, plik wyjściowy nie miał wszystkich znaków, ale zamiast tego wyświetlał znaki błędów
Dane wyjściowe pliku:
","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}
Oryginalny:
","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}
Wziąłem informacje z rozwiązania Dennisa i ten post znalazłem.
Oto mój kod:
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;
}
To pozwala mi zapisać zawartość do pliku bez problemów z kodowaniem.
Jak to działa: Zasadniczo zajmuje pojedyncze 8-bajtowe fragmenty składające się na znak UTF-8 i zapisuje je jako pojedyncze znaki (dlatego zbudowana w ten sposób postać UTF-8 może składać się z 1-4 tych znaków). UTF-8 koduje znaki w formacie o długości od 1 do 4 bajtów. To, co tu robimy, to kodowanie żądła w komponencie URI, a następnie weź ten komponent i przetłumacz go na odpowiedni 8-bajtowy znak. W ten sposób nie tracimy informacji podanych przez znaki UTF8 o długości większej niż 1 bajt.
Int8Array
ArrayBufferView
, można po prostu użyć notacji nawiasowej do skopiowania znakówstring[i] = buffer[i]
i odwrotnie.