ファイルアクセス (6/6)
作成:2012-12-10 08:06
更新:2012-12-10 09:04
更新:2012-12-10 09:04
■SJISファイルが読めない問題について
実際にいろいろと試してみると、中身を読み込めないテキストファイルがあることに気がつくでしょう。それは、SJIS(シフトJIS)などのファイルです。
Windows.Storage.FileIOのテキストファイルアクセス機能は、基本的に「ユニコード(UTF-8)」のテキストを前提にしています。このため、SJISなどの文字コードを使ったファイルは読み込みに失敗するのです。一応、readTextAsyncメソッドには第2引数として文字コードを指定するオプションも用意されていたりするんですが、これで指定できるのはUTF-8かUTF-16関連のものだけ。SJISのようなエンコードはサポートされていないようなのです。
まぁ、「これからはUTF-8が標準となります」ということなのでしょうが、Windowsの場合、長らくSJISが標準でしたので、SJISのままになっているテキストファイルも山のように残っていることでしょう。それらが読み込めないというのは問題でしょう。
いずれは対応するのかも知れませんが、現在のところの代替措置として、HTML5の「File API」を利用することでSJISファイルを読み込めるようにする方法を紹介しておきます。
●File APIによるテキストファイルの読み込み
読み込みが完了すると、onloadの関数が呼び出され、そこで処理が行われます。読み込まれたテキストデータは、FileReaderの「result」プロパティに保管されているので、これを取り出し、表示用タグのtextContentに設定するなどして利用すればよいでしょう。
下に、ファイル読み込み処理の修正版を掲載しておきます。これでSJISのファイルが読めるようになるはずです。ここでは、reader.readAsText(file, "sjis");というようにSJISを文字コードに指定することで、SJISの読み込みを可能にしています。
Windows.Storage.FileIOのテキストファイルアクセス機能は、基本的に「ユニコード(UTF-8)」のテキストを前提にしています。このため、SJISなどの文字コードを使ったファイルは読み込みに失敗するのです。一応、readTextAsyncメソッドには第2引数として文字コードを指定するオプションも用意されていたりするんですが、これで指定できるのはUTF-8かUTF-16関連のものだけ。SJISのようなエンコードはサポートされていないようなのです。
まぁ、「これからはUTF-8が標準となります」ということなのでしょうが、Windowsの場合、長らくSJISが標準でしたので、SJISのままになっているテキストファイルも山のように残っていることでしょう。それらが読み込めないというのは問題でしょう。
いずれは対応するのかも知れませんが、現在のところの代替措置として、HTML5の「File API」を利用することでSJISファイルを読み込めるようにする方法を紹介しておきます。
●File APIによるテキストファイルの読み込み
var 変数 = new FileReader();File APIでは「FileReader」というオブジェクトが用意されています。このオブジェクトを作成し、読み込み完了時のイベントonloadで実行する処理を用意した後、「readAsText」でFileオブジェクトを読み込みます。
《FileReader》.onload = function () {……読み込み時の処理……}
《FileReader》.readAsText(《File》, 文字コード名 );
読み込みが完了すると、onloadの関数が呼び出され、そこで処理が行われます。読み込まれたテキストデータは、FileReaderの「result」プロパティに保管されているので、これを取り出し、表示用タグのtextContentに設定するなどして利用すればよいでしょう。
下に、ファイル読み込み処理の修正版を掲載しておきます。これでSJISのファイルが読めるようになるはずです。ここでは、reader.readAsText(file, "sjis");というようにSJISを文字コードに指定することで、SJISの読み込みを可能にしています。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
function btn2Click(mouseEvent) { var openPicker = new Windows.Storage.Pickers.FileOpenPicker(); openPicker.fileTypeFilter.replaceAll([".txt"]); openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary; openPicker.pickSingleFileAsync().then(function (file) { if (file) { var p = document.getElementById("text1"); p.textContent = file.name; if (file !== null) { var reader = new FileReader(); reader.onload = function () { p.textContent = reader.result; }; reader.readAsText(file, "sjis"); } } else { WinJS.log && WinJS.log("cancelled.", "sample", "status"); } }); }
※関連コンテンツ
「JavaScriptで作ろう! Windows 8 アプリ・プログラミング入門」に戻る