Javascript 使用Firefox扩展保存网站文本,保存了错误字符

Javascript 使用Firefox扩展保存网站文本,保存了错误字符,javascript,firefox,unicode,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Unicode,Firefox Addon,Firefox Addon Sdk,很抱歉标题含糊不清,但我有点迷路了,所以很难具体说明。我已经开始使用附加SDK玩Firefox扩展。我尝试的是查看页面的更改,在本例中是Twitch.tv聊天窗口,并将这些更改保存到文件中 我已经让它工作了,每次页面上的内容发生变化时,它都会被保存。但是,像韩语中的某些东西这样的“不寻常”字符不能正确保存。我认为这与文件/字符串的编码有关?我试图通过复制粘贴到记事本来保存相同的字符,它要求我用Unicode保存,当我做的时候,一切都很好。所以我想,好吧,在写入日志文件之前,我会将日志文件的编码也

很抱歉标题含糊不清,但我有点迷路了,所以很难具体说明。我已经开始使用附加SDK玩Firefox扩展。我尝试的是查看页面的更改,在本例中是Twitch.tv聊天窗口,并将这些更改保存到文件中

我已经让它工作了,每次页面上的内容发生变化时,它都会被保存。但是,像韩语中的某些东西这样的“不寻常”字符不能正确保存。我认为这与文件/字符串的编码有关?我试图通过复制粘贴到记事本来保存相同的字符,它要求我用Unicode保存,当我做的时候,一切都很好。所以我想,好吧,在写入日志文件之前,我会将日志文件的编码也更改为unicode。完全不起作用。。。现在所有的角色都是用某种外语写的

我用来写入文件的代码如下:

    var {Cc, Ci, Cu} = require("chrome");
    var {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm");
    var file = FileUtils.getFile("Desk", ["mylogfile.txt"]);
    var stream = FileUtils.openFileOutputStream(file, FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_APPEND);
    stream.write(data, data.length);
    stream.close();
我在MDN上查看了FileUtils.jsm的描述,据我所知,没有办法告诉它我要使用哪种编码

如果你不知道解决办法,你能不能给我一些好的搜索词,因为我似乎在这方面做得不够。因为我对这个问题基本一无所知,所以我现在有点在黑暗中胡闹

编辑: 这就是我最终(目前)让这件事正常运行的原因:

var {Cc, Ci, Cu} = require("chrome");
var {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm");

var file = Cc['@mozilla.org/file/local;1']
           .createInstance(Ci.nsILocalFile);

file.initWithPath('C:\\temp\\temp.txt');
if(!file.exists()){
  file.create(file.NORMAL_FILE_TYPE, 0666);
}

var charset = 'UTF-8';
var fileStream = Cc['@mozilla.org/network/file-output-stream;1']
.createInstance(Ci.nsIFileOutputStream);
fileStream.init(file, FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_APPEND, 0x200, false);

var converterStream = Cc['@mozilla.org/intl/converter-output-stream;1']
.createInstance(Ci.nsIConverterOutputStream);

converterStream.init(fileStream, charset, data.length,
Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
converterStream.writeString(data);
converterStream.close();
fileStream.close();

仅仅转储原始字节(实际上是原始JSCHAR)是行不通的。您需要首先将数据转换为某种合理的编码

例如,请参阅。以下是创建转换器输出流包装器的关键部分:

var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
                createInstance(Components.interfaces.nsIConverterOutputStream);
converter.init(foStream, "UTF-8", 0, 0);
converter.writeString(data);
converter.close(); // this closes foStream
另一种方法是使用:


甚至可以将两者混合使用
OS.File
的好处是它将从主线程写入数据和访问文件(因此在写入文件时不会阻塞UI)。

仅转储原始字节(实际上是原始JSCHAR)不起作用。您需要首先将数据转换为某种合理的编码

例如,请参阅。以下是创建转换器输出流包装器的关键部分:

var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
                createInstance(Components.interfaces.nsIConverterOutputStream);
converter.init(foStream, "UTF-8", 0, 0);
converter.writeString(data);
converter.close(); // this closes foStream
另一种方法是使用:


甚至可以将两者混合使用
OS.File
的好处是它可以从主线程写入数据和访问文件(这样在写入文件时不会阻塞UI)。

你很漂亮,我终于找到了足够的关键字来让它工作。我将编辑我的原始帖子,以展示我最终做了什么(因为我使用的是附加SDK,我不得不在谷歌上搜索一些额外的代码更改)。你真漂亮,我终于得到了足够的关键字来让这件事工作。我将编辑我的原始帖子,以展示我最终做了什么(因为我使用的是附加SDK,所以我不得不在谷歌上搜索代码的一些附加更改)。