パスに非Ascii文字が含まれているとMigemoが動かない件

  1. 私の環境ではMery.exeのパスに非Ascii文字が含まれているとMigemoをONにして検索してもヒットしなくなるという現象が発生しました。

    1. C:\Users\Guest\Documents\ソフトウェア\テキストエディタ\Mery\Mery.exe → 正常に動作しない
    2. C:\Users\Guest\Documents\ソフトウェア\Mery\Mery.exe → 正常に動作しない
    3. C:\Users\Guest\Documents\Mery\Mery.exe → 正常に動作する
    4. C:\Users\Guest\Documents\Meryあ\Mery.exe → 正常に動作しない

    検証に使用したMeryは2.8.3 64bit zipと2.8.3 64bit Portableで新規にダウンロードしてmigemo.dllとdictフォルダを突っ込んだだけですので、マクロ・プラグインはデフォルトに同梱されている以外にありません。
    また、上記はMeryフォルダをコピーして作ったものですので1~4はMeryフォルダの中身は同じ構成のはずです(4だけMeryフォルダ名を変えましたが)。

    報告が上がってないところを見ると、私の環境だけなんだろうなと思いつつ、念の為報告します。

    【環境】
    ・Windows 10 Home 64bit 1803
    ・Mery 2.8.3 64bit zip / 2.8.3 64bit Portable

     |  Noah  |  返信
  2. ご報告ありがとうございます。
    私の環境でも現象を確認しました。

    Migemo の DLL 自体は問題なく読み込めているのですが、どうも Migemo 側が辞書ファイルのパスでユニコードに対応していないようで、日本語などを含むパスをユニコードで渡すとダメなようです。

    Mery 側で何らかの回避策を施す必要がありそうなので対策を調査してみますね。

     |  Kuro  |  返信
  3. 返信ありがとうございます。

    なるほど、migemo側がUnicodeに対応していないのが問題でしたか。

    Mery側で対応していただけるのであればありがたいですが
    エンドユーザ側で対策できるので検討した結果、対応しないということでも気にしません。

    # Mery側で対応する場合、辞書を隠しオプションで渡すとかになるんですかね。

     |  Noah  |  返信
  4. ご返信ありがとうございます。

    今、ちょうど研究していたところです。

    > なるほど、migemo側がUnicodeに対応していないのが問題でしたか。

    Migemo の辞書ファイル自体はユニコードに対応していたので、てっきり Migemo に渡すパスもユニコードに対応しているものと思って Mery 側でユニコードのまま渡していたことが問題でした。

    > # Mery側で対応する場合、辞書を隠しオプションで渡すとかになるんですかね。

    一応、ユニコードのパスをシフト JIS に変換して Migemo に渡してやると日本語を含むパスでも辞書ファイルを読み込むことができました。

    ただ、パスの中にシフト JIS では保持できないユニコード文字 (サロゲートペアとか) が含まれていると読み込めないようなので、もうちょっと調査してみますが妥協するかもしれません… ^^;

     |  Kuro  |  返信
  5. > 一応、ユニコードのパスをシフト JIS に変換して Migemo に渡してやると日本語を含むパスでも辞書ファイルを読み込むことができました。
    >
    > ただ、パスの中にシフト JIS では保持できないユニコード文字 (サロゲートペアとか) が含まれていると読み込めないようなので、もうちょっと調査してみますが妥協するかもしれません… ^^;
    Shift_JISで表現できる範囲であれば少なくとも私は全然困らないので、この案で十分すぎるほどです。

    # とはいえ、できればUnicode文字を含むパスも救いたい、というお気持ちもわかります。
    # が、Migemo側が対応していない以上、どうしようもないような・・・

     |  Noah  |  返信
  6. > ただ、パスの中にシフト JIS では保持できないユニコード文字 (サロゲートペアとか) が含まれていると読み込めないようなので、もうちょっと調査してみますが妥協するかもしれません… ^^;

    定番の対応法はショートファイル名で渡すとかですが。(ショートファイル名を作らない設定にしてあるとどうしようもないが...)

     |  foo  |  返信
  7. >> Noah さん
    ご返信ありがとうございます。

    ># とはいえ、できればUnicode文字を含むパスも救いたい、というお気持ちもわかります。
    ># が、Migemo側が対応していない以上、どうしようもないような・・・

    そのようですね、思いつく案は試してみたのですが結局だめでした…。

    と諦めかけたところに foo さんから情報が!

    >> foo さん
    情報ありがとうございます。

    おおー、そんな方法があったのですね。試してみたら辞書ファイルのパスにサロゲートペアを含んでいても読み込むことができました!

    C:\Temp\𠀋\Mery\dict\utf-8 (読み込めない)

    C:\Temp\B9AF~1\Mery\dict\utf-8 (読み込める)

    > ショートファイル名を作らない設定にしてあるとどうしようもないが...

    なるほど…。ショートファイル名って OS の設定で無効にできてしまうのですね。

    Windows API の GetShortPathName でショートファイル名を取得すると、OS でショートファイル名を無効にしている場合は普通にロングファイル名が返ってくる (たぶん) ようなので、これを利用すればショートファイル名が無効な環境でも一応シフト JIS の範囲でなら読み込み可能ということができそうです。

    次のバージョンでは試しにこの方法を実装してみようと思います。

     |  Kuro  |  返信
  8. ご対応ありがとうございます。

    修正されたことを確認しました!

     |  Noah  |  返信
  9. ご確認ありがとうございます。

    一応、Ver 2.8.4 では、

    OS でショートファイル名が有効になっている場合
    ・シフト JIS に変換できるパス: 読み込み OK
    ・ユニコード文字を含むパス : 読み込み OK

    OS でショートファイル名が無効になっている場合
    ・シフト JIS に変換できるパス: 読み込み OK
    ・ユニコード文字を含むパス : 読み込み NG

    という仕様になっています。

    動作検証は Windows 10 と Windows 7 と Windows XP で、それぞれ OS のショートファイル名の設定オン・オフで確認しました。

    ショートファイル名が無効の環境でのユニコード文字を含むパスは妥協しました… ^^;

     |  Kuro  |  返信
スポンサーリンク