2013-12-10 41 views
1

抱歉模糊的標題,但我有點失落,所以很難具體。我已經開始使用附加SDK開始使用Firefox擴展。我想要的是觀看頁面進行更改,在這種情況下是Twitch.tv聊天窗口,並將這些更改保存到文件中。使用Firefox擴展程序保存來自網站的文本,保存了錯誤的字符

我已經得到這個工作,每次在它被保存的頁面上發生了變化。但是,例如韓語中的「不尋常」字符不能正確保存。我認爲這與編碼文件/字符串有關?我試圖通過將它們複製粘貼到記事本中來保存相同的字符,它要求我保存在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(); 

我看着FileUtils.jsm超過在MDN的說明並儘可能我可以告訴有沒有辦法告訴它我想使用哪種編碼?

如果你不知道一個修補程序是否可以給我一些很好的搜索條件,因爲我似乎在這方面有所欠缺。因爲我在這個問題上基本上什麼都不知道,所以我現在在黑暗中徘徊了一下。

編輯: 這是我結束了(現在)讓這件事的工作:

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(); 

回答

1

傾銷只是原始字節(當然,原jschars實際上)將無法正常工作。您需要先將數據轉換爲一些合理的編碼。

參見例如File I/O Snippets。下面是創建一個轉換器輸出流包裝的關鍵位:

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 + TextConverter

let encoder = new TextEncoder();         // This encoder can be reused for several writes 
let array = encoder.encode("This is some text");     // Convert the text to an array 
let promise = OS.File.writeAtomic("file.txt", array,    // Write the array atomically to "file.txt", using as temporary 
    {tmpPath: "file.txt.tmp"});         // buffer "file.txt.tmp". 

混合既可能是甚至有可能。 OS.File有一個好處,它會將數據和訪問文件寫出主線程(所以它不會在寫入文件時阻塞UI)。

+0

你的美麗,我終於得到足夠的關鍵字來得到這個東西的工作。我將編輯我的原始文章,以顯示最終我做了什麼(因爲我使用的是附加SDK,因此我需要谷歌來對代碼進行一些其他更改)。 – Robert