みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

nkfで文字コードを変換したファイルをサクラエディタで文字化けせずに開く

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

nkfで文字コードを変換したファイルをサクラエディタで文字化けせずに開く

投稿記事 by みけCAT » 11年前

サクラエディタという、メニューをかなり自由に作れてキーマクロも使える、
便利なテキストエディタがあります。
今回言及するバージョンは2.1.0.0です。

しかし、残念ながら普通に使って気づくでも、完璧ではありません。
例えばTeraPadには存在する「文字コードを指定して上書き保存」という機能が見つからず、
「名前を付けて保存」で文字/改行コードを指定することはできますが、もちろん「上書きしますか」と一度聞かれることになります。

そこで、まずテキストファイルをエクスプローラで新規作成してサクラエディタで開き、
内容を入力して保存し、一回閉じます。
次にnkfでUTF-8に変換してからサクラエディタで開き直す、
ということをよくやるようになったのですが、この時に文字コードが判別されず元のSJISのままで開かれてしまい、文字化けしてしまいます。
幸い文字コードを指定して読み込み直す機能はあるのですが、二度手間です。
一応「前回と異なる文字コードのとき問い合わせを行う」という設定はありますが、
いちいち問い合わせせずに常に今の文字コードで開いて欲しいです。
一応確認しましたが、TeraPadならそんな変な動作にはならず、素直にUTF-8に変換した直後からUTF-8で開いてくれました。

というわけで、公式のWikiに要望を出しました。
Request/457 - SakuraEditorWiki

しかし、もちろん要望を出したからといってすぐに修正され、手元のプログラムに反映されるわけではありません。
そこで、プログラムが改善されるまでの間、応急処置がしたくなります。
サクラエディタのドキュメントを見ると、コマンドラインで文字コードを指定する機能があったので、これを活用することにしました。

まず、自前で文字コードを判別するプログラムを頑張って書いてもいいのですが、
めんどくさいのでnkfに丸投げし、その結果をサクラエディタに渡すプログラムを書きました。

CODE:

#!/usr/bin/perl

use strict;

my $editor="C:\\Program Files\\sakura\\sakura.exe";
my %code=(
	"Shift_JIS" => 0,
	"ISO-2022-JP" => 1,
	"EUC-JP" => 2,
	"UTF-16" => 3,
	"UTF-8" => 4
);

for(my $i=0;$i;
		close(NKF);
		chomp($nkfcode);
		my $nowcode=$code{$nkfcode};
		if(!defined($nowcode)){$nowcode=99;}
		system "cmd /C start \"\" \"$editor\" -CODE=$nowcode -- \"$nowfile\"";
	} else {
		system "cmd /C start \"\" \"$editor\" -- \"$nowfile\"";
	}
}
そして、これの関連付けをレジストリに書き込みます。

CODE:

キー : HKEY_CLASSES_ROOT\txtfile\shell\open\command
値 : (既定)
データ : C:\Perl\bin\perl.exe C:\myprograms\sakuraeditorproxy\sakuraeditorproxy.pl "%1"
この状態でエクスプローラからテキストファイル(*.txt)を開いてみると、
一瞬コマンドプロンプトのウィンドウが表示され、少し開かれるまでに時間がかかりますが、
SJISで保存したファイルをUTF-8に変換してから開いても、きちんとUTF-8で読み込んでくれることがわかります。
また、この方法では(nkfが非対応のようなので)CESU-8やUTF-7などに対応できてないようですが、
自分は普段そんな特殊な文字コードは使用しません。
よって、応急処置としてはこれで十分だと思います。

サクラエディタの前の文字コードへのこだわりに困っている人は、この方法を試してみてはいかがですか?
ただし、この方法の設定をした、もしくはしようとしたことによる、
関連付けが破壊された、テキストファイルが開けなくなった、レジストリが壊れた、Windowsが起動しなくなった、
アカウントを停止された、退学になった、クビになった、解雇された、ウイルスが検出されて通報された、
ウイルス対策ソフトに作業を妨害された、HDDがお亡くなりになった、SSDが寿命を迎えた、
キーボードが壊れた、マウスが壊れた、親に文句を言われた、ディスクの空き容量が無くなった、
環境変数%PATH%のデータが消えた、ウイルスに感染した、遠隔操作で掲示板への書き込みが行われた、
など、一切の損害について私は責任を負いません。自己責任でお願いします。

コメントはまだありません。