文字が"?"になる
-
外部ツールにて、カーソル行の文字列をコマンドプロンプトから実行させ、その出力を得るようにしています。
$(LineText) & Exit
出力は新規文書で表示便利です。重宝しております。月並みすぎるぐらいですが。
以前に相談しました。出力テキストの取りこぼしがある件です。
その際、バージョンが古いので新しいものをとのこと。指摘に従い2.8.8を必要な場面で使っています。それが私がダウンロードできる最新版でした。実はその件でも依然として同問題が発生しているのですが、それは滅多にないので注目しないで別の話です。
あるutf16LEファイルがあります。その中に次の二文字があるとします。
abc 腎肾
腎臓のジンです。不自然に並んでいますが当然です。説明のためです。
二文字目はU+80BEとMeryで表示されてます。下の方で。恐らくUTFでの文字番号です(私はユニコードについては門外漢です)。このファイルを
C:>find "abc"
的にFINDコマンド(FINDSTRはunicode未対応だそうです、MinGWのgrepとかは「それってバイナリファイルじゃん」って文句ゆうし)で検索するコマンドを件の外部ツールで実行すると、その結果が
abc 腎?
が新規文書で表示されます。つまり、文字U+80BEが"?"になります。
環境は数年前に買ったWindows10です。OSは64ビットらしいのですがそのMeryはx86です。
普通にコンソールで同コマンドを実行してコンソール文字をコピーしMeryに張り付けると問題ありません。前にも言いましたが、どうやら作者さんは当該機能のライブラリを使う側だけのようなので責任とかは全くないのでしょうが、解決方法はありますか?
| tokumei | 返信 -
Mery をご愛用いただきありがとうございます。
恐らくコマンドプロンプトのコードページがシフト JIS で動作しているためユニコード文字の「肾」が「?」として表示されているのだと思います。
Windows のコマンドプロンプトで以下のコマンドを実行していただくと、現在のコマンドプロンプトのコードページがわかります。
chcp 現在のコード ページ: 932
↑ 932 と表示されるとシフト JIS です。
Windows のコマンドプロンプト (シフト JIS モード) から Find コマンドを実行すると UTF-16 の文字が表示できますが、調べてみましたところ、"表示だけ" なら UTF-16 も使える場合がある、とのことです。
参考リンク:https://www.atmarkit.co.jp/ait/articles/1301/25/news092.html
Mery の外部ツールの機能は Find コマンドを直接呼び出すわけではなく、Windows のコマンドプロンプトで Find コマンドを実行した結果を受け取るだけなので、コマンドプロンプトで UTF-16 が "表示だけ" できたとしても、コマンドプロンプトがシフト JIS モードになっている場合、実行結果はシフト JIS で Mery 側に渡されますので、すでに「?」に文字化けしたデータが Mery 側に飛んできます。
参考リンクによると、そもそも Find コマンドはユニコードに対応していないとのことなので、Find コマンドを使うのはやめたほうが良いのではないかとも思いますが、一応、コマンドプロンプトをユニコードで動作させて Mery の外部ツールで Find コマンドのユニコード文字を含む結果を受け取る方法をご案内させていただきますね。
まず、普通にコマンドプロンプトをユニコード (UTF-8) で動作させる方法ですが、以下のコマンドとなります。
chcp 65001
例えば以下のような Find コマンドを使うバッチファイルを作成して、Mery の外部ツールのプロパティで [エンコード] の項目を [UTF-8] にすれば、ユニコードの文字をコマンドプロンプトから受け取ることができると思います。
chcp 65001 find "abc" "C:\Temp\a.txt"
a.txt に「abc 腎肾」が含まれているものとします。
Windows のコマンドプロンプトの文字コードはやっかいで、常にユニコード (65001) で起動する方法もありますが、ツールによってはコマンドプロンプトがシフト JIS モードで動いていても UTF-8 の結果を出力できるものもありますので、一概にどのコードページにしておけばいいとは言えないと思います。
このあたりは、外部ツールという機能の仕組み上、別のアプリケーションとの兼ね合いということでサポート外とさせていただいており、わかる範囲で回答させていただくかたちとなりますがご了承くださいませ。
| Kuro | 返信