NEC罫線についてNo.06152
jechabon さん 10/10/12 13:10
 
お世話になります。

NEC罫線を含むテキストファイル(PC-9801で作成したソースコード)を
秀丸で開くとエンコードの認識エラーが出てしまいます。
オリジナルファイルを変換しないで(書き換えずに)、秀丸で閲覧する
良い方法を教えてください。
(起動マクロでエラーを回避してNEC罫線→JIS罫線の変換は可能でしょうか?)

古いソースコードにはNEC罫線が含まれているものが多く苦慮しています。
エンコードの種類に「Shift-JIS+NEC罫線」があると、とても助かります。
今後のネタとしてご検討お願いします。

環境:XP(SP3)+秀丸8.02β12

[ ]
RE:06152 NEC罫線についてNo.06153
秀丸担当 さん 10/10/12 15:19
 

>NEC罫線を含むテキストファイル(PC-9801で作成したソースコード)を
>秀丸で開くとエンコードの認識エラーが出てしまいます。
>オリジナルファイルを変換しないで(書き換えずに)、秀丸で閲覧する
>良い方法を教えてください。
>(起動マクロでエラーを回避してNEC罫線→JIS罫線の変換は可能でしょうか?)

マクロでやると置換することは可能だと思いますが、認識エラーを出す前に文字
化けした状態でマクロを実行して、その後で文字コードの認識をさせるというこ
とは、申し訳ありませんが仕組み的にいってできないです。

具体的なテキストが無いので合っているかどうかわかりませんが、NEC特殊罫
線で全角のものでしたら以下のようなマクロでできるかもしれません。

disabledraw;
#xorg=x;
#yorg=y;
#searchoptionOrg = searchoption;
$searchbufferOrg = searchbuffer;
$replacebufferOrg = replacebuffer;
while(1){
  searchdown2
    "\\x86\\xA2|\\x86\\xA3|\\x86\\xA4|\\x86\\xA5|\\x86\\xAE|" +
    "\\x86\\xB1|\\x86\\xB2|\\x86\\xB5|\\x86\\xB6|\\x86\\xB9|" +
    "\\x86\\xBA|\\x86\\xBD|\\x86\\xBE|\\x86\\xBF|\\x86\\xC2|" +
    "\\x86\\xC5|\\x86\\xC6|\\x86\\xC7|\\x86\\xCA|\\x86\\xCD|" +
    "\\x86\\xCE|\\x86\\xD1|\\x86\\xD2|\\x86\\xD5|\\x86\\xD6|" +
    "\\x86\\xD9|\\x86\\xDA|\\x86\\xDD|\\x86\\xDE|\\x86\\xE1|" +
    "\\x86\\xE4|\\x86\\xED"
    , regular;
  if(result==false)break;
  #x=x;
  #y=y;
  replacedown "\\x86\\xA2", "─", regular;
  replacedown "\\x86\\xA3", "━", regular;
  replacedown "\\x86\\xA4", "│", regular;
  replacedown "\\x86\\xA5", "┃", regular;
  replacedown "\\x86\\xAE", "┌", regular;
  replacedown "\\x86\\xB1", "┏", regular;
  replacedown "\\x86\\xB2", "┐", regular;
  replacedown "\\x86\\xB5", "┓", regular;
  replacedown "\\x86\\xB6", "└", regular;
  replacedown "\\x86\\xB9", "┗", regular;
  replacedown "\\x86\\xBA", "┘", regular;
  replacedown "\\x86\\xBD", "┛", regular;
  replacedown "\\x86\\xBE", "├", regular;
  replacedown "\\x86\\xBF", "┝", regular;
  replacedown "\\x86\\xC2", "┠", regular;
  replacedown "\\x86\\xC5", "┣", regular;
  replacedown "\\x86\\xC6", "┤", regular;
  replacedown "\\x86\\xC7", "┥", regular;
  replacedown "\\x86\\xCA", "┨", regular;
  replacedown "\\x86\\xCD", "┫", regular;
  replacedown "\\x86\\xCE", "┬", regular;
  replacedown "\\x86\\xD1", "┯", regular;
  replacedown "\\x86\\xD2", "┰", regular;
  replacedown "\\x86\\xD5", "┳", regular;
  replacedown "\\x86\\xD6", "┴", regular;
  replacedown "\\x86\\xD9", "┷", regular;
  replacedown "\\x86\\xDA", "┸", regular;
  replacedown "\\x86\\xDD", "┻", regular;
  replacedown "\\x86\\xDE", "┼", regular;
  replacedown "\\x86\\xE1", "┿", regular;
  replacedown "\\x86\\xE4", "╂", regular;
  replacedown "\\x86\\xED", "╋", regular;
  moveto #x,#y;
}
setsearch $searchbufferOrg,#searchoptionOrg;
setreplace $replacebufferOrg;
moveto #xorg,#yorg;


他にも半角のものもあったりするようで、もし半角の特殊なものもあるとしたら、
検索して出てきた以下のページを参考してみるといいかもしれないです。(ペー
ジの一番下)

http://www.kt.rim.or.jp/~aotaka/pc/character.htm

[ ]
RE:06153 NEC罫線についてNo.06154
jechabon さん 10/10/12 16:08
 
> マクロでやると置換することは可能だと思いますが、認識エラーを出す前に文字
> 化けした状態でマクロを実行して、その後で文字コードの認識をさせるというこ
> とは、申し訳ありませんが仕組み的にいってできないです。

ファイルを開く際に、エンコードの種類を自動判別でなく、Shift-JISを選択して
いるにもかかわらず認識エラーが出てしまう(判別しようとしている?)ので困っ
ています。
認識エラーを抑止する事はできないでしょうか?


> 具体的なテキストが無いので合っているかどうかわかりませんが、NEC特殊罫
> 線で全角のものでしたら以下のようなマクロでできるかもしれません。

マクロまで提示して頂き、ありがとうございます。
試してみましたが、Core2(2GHz)のPCで3000行程度のファイルを変換するのに
約30秒もかかってしまいました。
マクロを速度UPしようと思うのですが、コツとかあれば教えてください。


NEC罫線をコピー&ペーストすると、文字コードが変化してしまいます。
例えば0x86A3のコードをコピペすると0x8145に化けてしまいます。
「行の2重化」を実行した場合は文字コードは変化しませんでした。
オリジナルのコードを維持したまま、コピペする事は可能でしょうか?


以上、よろしくお願いします。

[ ]
RE:06154 NEC罫線についてNo.06155
秀丸担当 さん 10/10/12 17:15
 

>ファイルを開く際に、エンコードの種類を自動判別でなく、Shift-JISを選択して
>いるにもかかわらず認識エラーが出てしまう(判別しようとしている?)ので困っ
>ています。
>認識エラーを抑止する事はできないでしょうか?

[その他]→[動作環境]→[ファイル]→[エンコード2]の「変換できない文字があっ
たとき警告メッセージを表示」をOFFにすると抑制できます。ただ、いつでも警告
はでなくなってしまいますが。

マクロで開く場合は、デフォルトでこのエラーは出ないので、例えば以下のマク
ロを使って開くと警告は出ないです。

  OPEN;  //あるいはopenfile "*.*";
  endmacro;

ちなみにマクロ中でも警告を出すためにはseterrormodeを使います。


>マクロまで提示して頂き、ありがとうございます。
>試してみましたが、Core2(2GHz)のPCで3000行程度のファイルを変換するのに
>約30秒もかかってしまいました。
>マクロを速度UPしようと思うのですが、コツとかあれば教えてください。

無駄に遅そうな気がしたので、replaceallfastではなくsearchdownとreplacedown
の組み合わせにしてみたのですが、あまり効果はなかったようです。すみません。
codeキーワードでカーソル位置の文字コードを取得してから値を変換してinsert
文でやったらどうかと考えましたが、試しにやってみてもあまり変化はありませ
んでした。

変換モジュールを作るとかなり高速になるとは思います。
もし必要であれば、そういう変換モジュールを作ってライブラリにアップしてみ
ます。


>NEC罫線をコピー&ペーストすると、文字コードが変化してしまいます。
>例えば0x86A3のコードをコピペすると0x8145に化けてしまいます。
>「行の2重化」を実行した場合は文字コードは変化しませんでした。
>オリジナルのコードを維持したまま、コピペする事は可能でしょうか?

コピーの段階でUnicodeとしてコピーしているので、Unicodeにこの文字コードに
相当する文字が無いためそうなってしまうようです。

貼り付けに関しては[その他]→[動作環境]→[編集]に「貼り付けでUnicodeを使用
する」というオプションがあって、これをOFFにすると外部ソフトの非Unicode
(=Shift-JIS)を貼り付けできますが、その逆のオプションはいまのところ無い
です。

V8.xxで仕様変更や追加はなるべくしたくないということもあるので、上記変換モ
ジュールの案で変換モジュールを呼び出すことでコピーとなるというような方法
も考えられるかもしれないです。

[ ]
RE:06155 NEC罫線についてNo.06156
jechabon さん 10/10/12 17:49
 
> [その他]→[動作環境]→[ファイル]→[エンコード2]の「変換できない文字があっ
> たとき警告メッセージを表示」をOFFにすると抑制できます。ただ、いつでも警告
> はでなくなってしまいますが。

抑止できました。ありがとうございます。


> 変換モジュールを作るとかなり高速になるとは思います。
> もし必要であれば、そういう変換モジュールを作ってライブラリにアップしてみ
> ます。

よろしくお願いします。


> 貼り付けに関しては[その他]→[動作環境]→[編集]に「貼り付けでUnicodeを使用
> する」というオプションがあって、これをOFFにすると外部ソフトの非Unicode
> (=Shift-JIS)を貼り付けできますが、その逆のオプションはいまのところ無い
> です。

了解しました。

[ ]
RE:06156 NEC罫線についてNo.06157
秀丸担当 さん 10/10/13 15:50
 

変換モジュールライブラリにアップロードしました。
http://hide.maruo.co.jp/lib/hmconv/neckeisen100.html


マクロから使う場合は
selectall;
filter "C:\\Folder\\NecKeisen.hmf","Nec2Sjis";
というようにするとできると思います。

[ ]
RE:06157 NEC罫線についてNo.06158
jechabon さん 10/10/13 16:14
 
> 変換モジュールライブラリにアップロードしました。

早速試してみました。
マクロで30秒かかったファイルが、一瞬(計測不可)で変換されました!!
ありがとうございます。

ただ、範囲選択した行は変換の有無にかかわらず全て「編集した行の行番号」
のデザインになってしまいます。
変換した行のみ「編集した行」にする事は無理ですか?

[ ]
RE:06158 NEC罫線についてNo.06159
秀丸担当 さん 10/10/13 16:45
 

>ただ、範囲選択した行は変換の有無にかかわらず全て「編集した行の行番号」
>のデザインになってしまいます。
>変換した行のみ「編集した行」にする事は無理ですか?

変換した範囲が全て編集した行になってしまうのは避けられないですが、検索系
コマンドの「編集マークのクリア」を実行すると、編集した行の表示を全て消す
ことができます。
32bit版のNecKeisen.hmfを秀丸エディタのフォルダにコピーしたとして、
clearupdatedを付けると消すことができます。

マクロの例:

  selectall;
  filter hidemarudir + "\\NecKeisen.hmf","Nec2Sjis";
  clearupdated;


または、少々強引ですがNEC罫線のある行にダミーの文字を入れておいて、変換
後にダミー文字を消すようにすると近い状態にはなるかもしれません。
(以下の例はダミー文字に0x86a0という適当なのを使ってしまいました)

マクロの例:

  disabledraw;
  #x=x;
  #y=y;
  #searchoptionOrg = searchoption;
  $searchbufferOrg = searchbuffer;
  $replacebufferOrg = replacebuffer;
  replaceallfast "^(?=.*[\\x86\\xa2-\\x86\\xed])", "\\x86\\xa0",
           regular;
  selectall;
  filter hidemarudir + "\\NecKeisen.hmf","Nec2Sjis";
  clearupdated;
  replaceallfast "^\\x86\\xa0", "", regular;
  moveto #x,#y;
  setsearch $searchbufferOrg,#searchoptionOrg;
  setreplace $replacebufferOrg;

[ ]
RE:06159 NEC罫線についてNo.06160
jechabon さん 10/10/13 18:18
 
> または、少々強引ですがNEC罫線のある行にダミーの文字を入れておいて、変換
> 後にダミー文字を消すようにすると近い状態にはなるかもしれません。

このマクロでうまくいきました。速度的にも問題ないです。
ありがとうございました。

[ ]