我发现我在使用这种方法时遇到了问题,基本上是因为我试图将输出写入文件中并且未正确编码。由于JS似乎使用UCS-2编码(source,source),因此我们需要进一步扩展此解决方案,这是我使用的增强型解决方案。
我对普通文本没有任何问题,但是当使用阿拉伯语或韩语时,输出文件没有所有字符,而是显示错误字符
文件输出:
","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}
原版的:
","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}
我从dennis的解决方案中获取了信息,并且发现了这篇文章。
这是我的代码:
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;
}
这使我可以将内容保存到文件中而不会出现编码问题。
工作原理:基本上,它是由一个构成UTF-8字符的8个字节的单个块并将其保存为单个字符(因此,以这种方式构建的UTF-8字符可以由这些字符中的1-4个组成)。UTF-8以1到4个字节长度的格式编码字符。我们在这里所做的就是在URI组件中编码字符串,然后将其转换为相应的8字节字符。这样,我们不会丢失超过1个字节长的UTF8字符所提供的信息。
Int8Array
ArrayBufferView
则可以简单地使用括号表示法来复制字符string[i] = buffer[i]
,反之亦然。