1 件の投稿を表示中 (合計 2 個)
  • 作成者
    投稿
  • #31678
    yasuji
    参加者

    江村様

    いつもお世話になっております。
    yasujiです。

    ウィンドウ再描画が行われない (スクロールバー付近)の内容について提示されたマクロを実行した後の検証中に不具合を見つけました。

    EmEditorが、エンコーディングにおいてバイナリ編集をサポートしていることから不具合と認識しています。Null文字(\x00)が含まれていても正確に表示編集ができないとバイナリ編集を実現できないため。

    Null文字を含むランダム文字列生成マクロ(文末に示した(M1))を実行して得られたテキストについて、マウス選択操作ならびに検索操作を行った際に正常な捜査結果が得られない下記の不具合が見つかりましたので、修正をお願いします。
    なお、EmEditor v24.0.0で確認しております。前提条件のEmEditorの設定値は、portable版を使用しzipファイルから展開した状態を初期設定として、各種操作を実施しています。

    〔不具合1〕ランダムテキスト生成マクロ実行後に[DirectWriteを使用]をONからOFFに変更するとNull文字表示の 半角文字NUL文字 が表示されなくなる

    〔不具合2〕ランダムテキストを表示した状態で[DirectWriteを使用]をONからOFFに変更すると行全体が2,3ピクセルほど下方向に移動して表示される

    〔不具合3〕ランダムテキスト生成マクロ実行後にマウス操作のみでNull文字を跨いで文字列選択が困難

    〔不具合4〕ランダムテキスト生成マクロ実行後にNull文字を含む行全体を選択コピーしても、行先頭から一つ目のNull文字までの文字列しか貼り付けられない文字列コピー動作異常(同一タブ内、新規テキスト文書タブ内)
      ただし、保存したファイルを開いて、同一の操作をした場合は、同一タブ内、新規テキスト文書タブ内へ選択コピーした同一の文字列の貼り付けができる。

    〔不具合5〕ランダムテキスト生成マクロ実行後にキーボード操作のみでNull文字を跨いで文字列選択を行うと選択した最右端から右側の文字表示が数文字程度表示が消失
      ただし、(1)最左側でマウスカーソルが右向きの時にクリックする行選択、(2)キーボード十字キーとShiftキーでの選択操作、
      (3)Sfhitキー+Endキー出の選択操作はできるが、選択した最右端から右側の文字表示が数文字程度表示が消失する。

    〔不具合6〕ランダムテキスト生成マクロ実行後にCtrl+Homeキー押下し、Ctrl+Fで[検索]ウィンドウを開き、\x00を正規表現検索で[次を検索]を複数回押下しても、
      一つ目のNull文字のみ選択できるが、それ以降にNull文字があるにも関わらず選択されない、「現在位置より下には \x00 は見つかりませんでした」の表示もされず、\x00について検索が機能しなくなる。

    〔不具合7〕ランダムテキスト生成マクロ実行後にNull文字表示が 半角文字NUL文字 となるが、変更せず保存して閉じて[バイナリ(アスキー表示)で開く]形式で開くと 半角文字白黒反転@文字 となり表示が一致しない
      ==> 生成直後と開いた保存ファイルのNull文字(\x00)表示方式は、[DirectWriteを使用]=ONの場合は、半角文字NUL文字、[DirectWriteを使用]=OFFの場合は、半角文字白黒反転@文字の表示に統一するのがベストと思います。

    〔不具合8〕ランダムテキスト生成マクロ実行後にファイルを保存して、変更せず保存して閉じて[バイナリ(アスキー表示)で開く]形式で開き、Ctrl+Fで[検索]ウィンドウを開き、
      \x00を正規表現検索で[次を検索]を複数回押下しても、「現在位置より下には \x00 は見つかりませんでした」が表示されて、\x00について検索が機能しない。
      ==> Boost regular expression library v1.80を使用しているNotepad++ v8.6.4(64bit)において、
        保存したファイルを開いて\x00を正規表現検索で[次を検索]の複数回押下で順次Null文字を選択することを確認済み。

    上記不具合の発生の再現手順は下記の通りです。

    〔対象〕
    v24.0.0 (64bit)

    〔使用環境〕
    OS: Windows 10 Pro 64bit, ver 22H2

    〔再現手順〕
    1.EmEditor 64bit ポータブル版を初期状態で起動
     zipファイルから展開して、起動する。
     初回のエディション選択は、Professionalを選択する。

    2.文末の(M1)マクロをファイルに保存してマクロを登録
     ファイル名は、GenRandText+00-02.jseeとする。
     そのファイルをマクロとして登録する。

    3.マクロ[GenRandText+00-02]を実行
     文字列が何もない新規テキストタブ内で下記のマクロを実行すると、下記のようなテキストを得ることができる。
     ただし、ここでは制御文字が表現できないため、\x00(Null)を * に置き換えています。
     1行目は空行がありますが、forum上では表示されないため、文字列のある行を2行目としてください。

    A0CkhtQ2*YNSsnHKZKxx2MByWLRcwtmOVOouD6pl6OPrAK6FvOAbQXNgxDutSlct48zxT9d3JogDbMt16azvmqz8loZEbr171lTp
    1fCF8KLhrRvexdQ03zPR14vwp*xKmawmRviQv9TKe7vqyj3a9AE6d7xe6c9Muk8T7DqFlmPajjwWKiI0ng4xD2j81jDHFPXAUNw1
    kpHH1SQJ6W1quMnLclwIz5m4GNxKLaB2H3sd8oYXmiVO5hndHGtGuowdamZLWOA5rqYbz9nFtTRfMulm74gyyz*2w4Ddj2dKpYkW
    nZmg3hNWCNXMYyeqijS39Rrrl0YHhYLuE1OoENK5mNFjkszlMPAre7EUnnKESBdYyf4FAFeOQvjSC8kIO7q1wJ2b2zNiI8DvEQTP
    6j4GVyB0Wxz9KPguSA0rjVsMW0RfszArl*DZKq1iT0CwqITwo0Ss4Ho*f8tWTltuaO4VQw5uFZ224RiVvt3dnuCryhCPsJkXE7zL
    4a*Q2Y8yDk2zpKnOhihE*z7ln*tVH3cI3GqEm3QjGx2rOMDcXAGJa4q4pkHiCxWgh01RC2SZBj9LVowLDLK7yZTsbFtranbK15UN
    BHAzBrr5LiNc4fvyFjxfHHtFeQ0FOw1ADbjsGlB94FlMe3Gu2k2MCIJ2wXKY9G0IEFn54ARIdbKOPEZbKOcurKvVHftWlcDdbht3
    0A5UoIte0A2PioH*34Fh5iM9vv4YVX6rRP3aijTldx7enb7KQGyKmVgh9PwSMh3JOb7RFtRtcq2Bp9np3GOvSh8fburOkv1dGFg4
    2QdcKWbCdCoIUwS62ynru8P*HOOw0afCWrtNJgBNpg4EslgMKLyvcSqj6qJMLwmyG8qvjo226pl*OBYnZuGualVFGYhGQ1xydPn2
    rFns2PI*5F9H9Zc9ocVAXzLdYu4VY*6k4TCdxSiUdQuwcObbNnZyWNNrNmw4hhaP1dHH1y9GfjiZspBzkpD6tmxf7IP6oHFNuNQF

    4.マクロ出力結果をファイルに保存
     このまま何も変更せずに em_test_01.txt のファイル名で保存する。

    5.(M1)マクロの実行直後のテキストのDirectWriteのON/OFFによる表示確認
     [DirectWriteを使用]のON/OFFを切り替えて下記を確認する。

     [DirectWriteを使用]=ON *は半角文字のNULとして表示される。
     [DirectWriteを使用]=OFF *は表示されない。
     ==>〔不具合1〕が発生する
     ==>〔不具合2〕が発生する
     
    6.マウスによるNull文字を含む文字列の選択操作
     [DirectWriteを使用]をON/OFFに切り替えてそれぞれで実施する。

     マウスでで3.の出力テキストの2行目の最先頭からNull文字を跨いで選択操作をする。
     Null文字を跨いだ選択操作であればどこの箇所も同様に選択が困難になる。
     ==> [DirectWriteを使用]がON/OFFのいずれであっても、〔不具合3〕が発生する

    7.マウスによるNull文字を含む行全体選択とコピー操作
     [DirectWriteを使用]をON/OFFに切り替えてそれぞれで実施する。

     マウスカーソルを最左側のマウスカーソルが右向きに変化するとこまで移動させて、クリックして行選択をする。
     行選択状態の行を右クリックして、メニューからコピーをクリックする。
     カーソルを最下行まで移動させて、改行を挿入後に貼り付けをする。
     貼り付けられたテキストは、Null文字までのテキストになっている。新規テキスト文書タブを作成して、貼り付けても同じ結果になる。
     ==> [DirectWriteを使用]がON/OFFのいずれであっても、〔不具合4〕が発生する

    8.キーボードによるNull文字を含む文字列の選択操作
     [DirectWriteを使用]をONにする。
     7.でコピーした文字列とは異なる行の最先頭にカーソルを移動し、
     Shiftキーを押しながら右矢印キーでNull文字を跨いで行の最後10文字くらい手前まで選択する。
     ==>〔不具合5〕が発生する

     [DirectWriteを使用]をOFFにする。
     上記と同じ手順操作をしても、不具合は発生しない。

    9.正規表現による\x00の検索操作
     [DirectWriteを使用]をON/OFFに切り替えてそれぞれ実施する。

     Ctrl+Homeキーを押下して文書の1行目1文字目へカーソルを移動させる。
     Ctrl+Fキーで検索ウィンドを開き、検索文字列に \x00 を入力する。
     [次を検索]を複数回押下して、すべてのNull文字の検索選択を行う。
     ==> [DirectWriteを使用]がON/OFFのいずれであっても、〔不具合6〕が発生する

    10.操作していたタブを閉じてファイルを開く
     操作していたem_test_01.txtのタブを変更を保存せずに閉じて、再度em_test_01.txtを[バイナリ(アスキー表示)で開く]形式で開きなおす。
     [DirectWriteを使用]のON/OFFを切り替えて3.の状態と比較して確認する。
     ==>〔不具合7〕が発生する

     [DirectWriteを使用]をON/OFFに切り替える。
     ==>〔不具合2〕が発生する

    11.正規表現による\x00の検索操作2
     [DirectWriteを使用]をON/OFFに切り替えてそれぞれ実施する。

     Ctrl+Homeキーを押下して文書の1行目1文字目へカーソルを移動させる。
     Ctrl+Fキーで検索ウィンドを開き、検索文字列に \x00 を入力する。
     [次を検索]を複数回押下して、すべてのNull文字の検索選択を行う。
     ==> [DirectWriteを使用]がON/OFFのいずれであっても、〔不具合8〕が発生する

    〔使用したマクロ〕
    (M1) ランダムテキスト100文字10行の生成マクロ(Null文字を含む)

    
    // EmEditor forumへの報告する場合は、制御文字を記号に置換するために true に設定する
    var forReport = false;
    // 文字コード
    var CHAR_CODES = [
    	// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
    	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
    	// A, B, C, D, E, F, G, H, I, J, K, L, M,
    	0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D,
    	// N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
    	0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A,
    	// a, b, c, d, e, f, g, h, i, j, k, l, m,
    	0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D,
    	// n, o, p, q, r, s, t, u, v, w, x, y, z,
    	0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
    	// Null
    	0x00
    	];
    
    // ランダムな文字列生成
    function getRandomString(length) {
    	var result = "";
    	var max_index = CHAR_CODES.length;
    	for (var i = 0; i < length; i++) {
    		var index = Math.floor(Math.random() * max_index);
    		result += String.fromCharCode(CHAR_CODES[index]);
    	}
    	return result;
    }
    
    if (forReport) {
    	// EmEditor forumへの報告するために制御文字を記号に置換する
    	CHAR_CODES[CHAR_CODES.length - 1] = '*'.charCodeAt();	// Null を * に置換
    }
    
    // 現在のカーソルある行の次の行にランダムテキストを挿入する
    document.selection.EndOfLine();
    document.selection.NewLine(1);
    for (var i = 0; i < 10; i++) {
    	document.selection.Text = getRandomString(100);
    	document.selection.NewLine(1);
    }
    

    よろしくお願いします。

    #31686
    Yutaka Emura
    キーマスター

    いつもお世話になっております。江村です。

    EmEditor では、null 文字はサポートしていません。ただし、エンコードとして バイナリ (アスキー表示) を指定してファイルを開く場合には、null文字を U+3100 に変換して @ の反転文字として表示しています。バイナリ (アスキー表示) 以外の場合には、既定だと警告メッセージを表示して、それでも継続する場合は、null文字をスペースに変換してから読み込んでいます。

    今回のようにマクロで document.selection.Text = str とした場合、v8 の場合は、そもそも null文字のところで文字列が切れて代入されてしまいます。JScript だと null文字を含めて代入しようとしますので、v24.0.1 と v24.0.901 で修正しました。バイナリ (アスキー表示) の場合は U+3100 に変換し @ の反転文字として表示し、それ以外のエンコードでは、メッセージを表示してマクロを終了します。ただし、これは try 構文により回避可能です。

    また、バイナリ (アスキー表示) の場合に null 文字を検索したい場合には、エスケープ シーケンスを使用して 0x3100 を検索すれば可能ですが、正規表現では検索できません。

    よろしくお願いいたします。

1 件の投稿を表示中 (合計 2 個)
  • このトピックに返信するにはログインしてください。