0x200Fが文字列に含まれるときのコード前後の挙動について

  1. またもUnicodeめ!という事例なのですが、偶然発見出来て再現性もあったので報告しておきます。

    Twitterの画像プレビューで気に入った画像があり、
    アカウント名とコメントの一部をワンラインにしてファイル名にしようと
    Meryに貼り付けて編集を始めたものの、
    『アカウント行を後ろからBSで削って行き、日時の前のスペースを超えると
     スペースが削除されずアカウントのアルファベットが消え始める。』
    といった、意図と違う動作を確認しました。
    よく見てみるとアカウントIDの@と1文字目が重なって描画されており、
    @の前に『0x200F(UNICODE 0x200F Right-To-Left)』が含まれていることが分かりました。
    これは稀にサービスやソフトウェアのテキストコピペから紛れ込むようです。

    Unicodeには挙動を変えるコードが多く、そういったものの悪さになりますが、
    エディタ上でどういう挙動が正しいかも最早理解しきれないですね……。
    対応が必要そうであれば、そのうち修正を宜しくお願い致します。

    確認環境:
    Mery 2.4.6.5927
    Windows 10 Pro ver1511 build10586.17

    そして長い雑談書き込むのもなんだなと思っていたら
    たまたま報告することが出来たので、ついでにちょっとした雑談を。
    長い&好きで書いてるだけなので気が向かなければ目を通す必要はないです(汗)。

    Kuroさんの先日のつぶやき(svchostの件)については
    自分も同じく気になって調べたことがあります。
    ただ数が気になっただけで詳細自体はお知りかもしれませんが以下詳細。

    結論から言えば各種サービスを実行するときに
    親となり諸々を取り仕切るOS側の仕組みみたいですね。
    自分とこでも12個くらい立ち上がってるようなので
    元々デフォでそれくらい待機しているのだと思います。
    自分とこはうち9個くらい何もぶら下がらず遊んでいます。

    心配であれば起動中のタスクをチェックするコマンドや

    MS謹製 Process Explorer
    https://technet.microsoft.com/en-us/sysinternals/processexplorer

    のようなツールでsvchost.exeに何がぶら下がっているのかは確認出来ます。
    このツールだと説明や会社名である程度そのプロセスの身元が表示されます。

    当然会社名や説明の偽装をされたり、svchost.exeを名乗るウイルス等も存在するようなので
    絶対ではありませんが、偶には自衛の為に確認しておくのは良いことかと。
    気にし始めるとキリがなく、今度は見知らぬ通信が無いかと
    ネットワークポートまで調べ始めたりして、精神衛生上宜しくないです。
    自分もこれでKuroさんの言うように精神ダメージを(爆)。

    なお『なんちゃらBroker.exe』という不安になる名称のものも散見されますが
    こちらは説明が無いものでも大概Microsoft関連のプロセスのようです。

    Chromeも本体+タブのプロセス数にならなかったりするからいろいろ謎ですよね。
    こちらはわざわざソース読むのも嫌で調べるのは過去に諦めましたw

     |  みじゅい  |  返信
  2. ● みじゅい さん
    > Unicodeには挙動を変えるコードが多く、そういったものの悪さになりますが、
    > エディタ上でどういう挙動が正しいかも最早理解しきれないですね……。

    notepad 準拠を謳っているので、notepad を信じるしかないのではないでしょうか。
    きっと Microsoft なら完璧な Unicode 対応がっ!
    (でも色つき顔文字とかいけるのかな……)

    > Chromeも本体+タブのプロセス数にならなかったりするからいろいろ謎ですよね。
    > こちらはわざわざソース読むのも嫌で調べるのは過去に諦めましたw

    伝聞で不確かですが、本体以外にも描画用などの専用プロセスがあること、
    またタブに対するプロセスも最大数で制限をかけて使い回していると聞いたことがあります。
    なのでそれが原因ではないでしょうか。

     |  ks  |  返信
  3. ご報告ありがとうございます。
    ヤダー!Unicode ヤダー!テキストエディタなんてこうしてやるっ!このっ!このっ!

    そゆことで、泣きながら調査してみたところ 0x200F などは Unicode 制御文字と呼ばれるもので、文字の書く方向を指定したりする際に使用する文字のようです。メモ帳の右クリックで挿入できるやつですね。

    Mery では DirectWrite を有効にしていると文字が重なってしまったりなどの不具合が起きるようですが、そもそも DirectWrite が対応してないんじゃね?っていう感じがします。秀○エディタさんの場合は DirectWrite 有効時は Unicode 制御文字は無視しているようなので、Mery もそんな感じにしようかと思います。

    まさか Twitter をチェックされているとは…w お恥ずかしい。

    svchost は特に関係なかったようで、結局、HDD が壊れ気味で PC の挙動がおかしかったようで、後日、めでたく HDD がお亡くなりになりました。

    ● ks さん

    > notepad 準拠を謳っているので、notepad を信じるしかないのではないでしょうか。

    基本的に notepad 準拠したいなーとは思っていますが、Unicode の描画はマネできませんねぇ。特に右から左へ書く文字とかの対応は絶望的です。

    chrome.exe はアドオン入れてるとさらに増殖するというウワサもありますね…
    もうメモリが限界で、そろそろ PC を買い替えないと時代についていけない気がします。(いまだに Pentium ッス!)

    Delphi 買わずに PC 買えばよかった…

     |  Kuro  |  返信
  4. ▼To Kuroさん
    ご返答ありがとうございます。

    > 0x200F
    自分はそもそも一庶民でアラビア語等を扱うつもりは毛頭無いので、
    Kuroさんなら正規実装しないにしても描画重複はしないように対応されるかなと
    報告上げてみた次第ですね。
    書く方向が変わる挙動などは自分も流石に検証する気力もないですし、
    正規実装の話になったらむしろやめるよう説得始めます(汗)。

    なお、対応についてはメモ帳のように見えないけどカーソル移動が1回多くなる、
    というよりは、豆腐やゲタみたいになにか描画はあった方が実際に例に挙げたように、
    おかしい文字をMeryで認識して弾いてから
    他に貼り付けられるので個人的には好みではありますが、
    以前の現時点では過剰な要望と同じく頻繁に困るものでもないので、
    気が向いたときに好きなように修正してやってください。
    Unicodeの特殊文字は多すぎて、ASCIIの制御文字みたいに
    ほぼ不要なものと断定して分類や色分け出来ないのが痛いですね。

    > Twitter
    技術系の方のツイートは知らない技術やガジェットなどなど、
    自分が知らないけど興味を引く物やワードの宝庫ですからね。
    自分はろくな呟きをせず相互フォローになるとかえって先方の迷惑になるので、
    どうしてもフォロー無しの読み専にはなってしまうのですが(汗)。

    ▼To ksさん
    コメントありがとうございます。

    > メモ帳準拠
    どこかに明記されていたかなぁと思いつつ。
    Windows自体はグローバル言語対応だからRTLとかについてはメモ帳は
    ただのOSアクセサリーに留まらない高度な対応をしていることもありますが、
    異体字セレクタとかいろいろ適当なことも多いので、
    Kuroさんの言う準拠は前回の自分の要望の時には言及されていますが
    挙動の目安程度ではないかと認識していました。
    仕様書が出ているわけでもオープンソースでもないので
    頑張ってもそれくらいに留まるかなと。

    ▼To Kuroさん、ksさん
    > Chromeのプロセス
    調べ始めると割と本腰入れて時間費やしてしまうので
    あえて軽く書いたのでした(汗)。

    検索したら思ったより簡単に出てきたのと
    以前試した時と違って大体想定通りに動くのを確認出来たので書いておくと、
    とりあえず本体とレンダリングとプラグインの3プロセスが立ち上がり、
    ChromeWikiのFAQに書いてある最大34プロセスという通り、
    タブやプラグイン起動が増える毎にほぼ最大数まで増えていきますね。
    昔試した時は期待通りにならなかったり、今も何かのアクション直後だと
    一時的に増減したりはするので、相変わらず個人的には気持ち悪いですw

     |  みじゅい  |  返信
  5. > Kuroさんなら正規実装しないにしても描画重複はしないように対応されるかなと
    > 報告上げてみた次第ですね。

    さすがですw
    迷うべきポイントとしては DirectWrite 無効時には一応描画だけはできてるので、そこを残すか、そこも無視するようにするかというところでしたが、先人に倣えということで秀○さんの仕様を参考にさせていただくことにしました。(国産テキストエディタで DirectWrite に対応していて、その仕様が「ウンウンそうなんだよな!」って同感できるのは秀○さんだけだと思ってますw)

    > 正規実装の話になったらむしろやめるよう説得始めます(汗)。

    そこまでご理解いただいているとありがたいです^^;
    でも、少しだけ、制御文字によるキャレットの逆方向動作ぐらい私の技術力ならできるんじゃね?と思って、挑戦してみましたけど、予想以上に私の技術力が低くて無理でした…

    > 豆腐やゲタみたいになにか描画はあった方が実際に例に挙げたように、

    一応 Mery では ASCII コードの制御文字に関しては [SOH] みたいな感じで文字として表記するようになっているので、Unicode 制御文字もそんな感じで分かるように表示しようかなとも思ったのですが、とりあえずは崇拝する秀○さんと同じ感じで、何も表示されないかもしくはちょっと隙間があくぐらいのまま、なるべく OS の処理に任すようにしてみます。

    ちなみに、メモ帳準拠というのはどこにも明記していないと思います。Mery はメモ帳準拠というコンセプトなわけではないですが、マイクロソフトの純正ソフトの挙動に似せておけば、使いづらい部分も含めて「どこかで感じた操作感」ってことで、使いやすいんじゃないかなと思って MS 製品に準拠したいとは思ってますw

    メモ帳自体も完全ではないですし、挙動の目安でもあり、言い訳の材料でもありますw (いやぁ、メモ帳だってこんなんですし… っていっとけば OK みたいなw)

    でも DirectWrite みたいな面白い機能に自力で対応できたときはけっこーテンションあがりましたけどね!こういうのがあるから日曜プログラミングはやめられないw

     |  Kuro  |  返信
  6. いつも対応検討ありがとうございます。
    アンチエイリアスした方が多少目に優しいので、
    歳食ってくるとDirectWriteが手放せないです(ぇ

    > 予想以上に私の技術力が低くて無理でした…
    この場合は技術力が低いのではなくて、
    PC技術は1つ増えると学習や認識にかなりの時間を費やすことになるので、
    いわゆる弱くてニューゲームになっているだけかと(涙)。
    プログラム言語変更とかならまだ構造が似てるから経験が生きるなんてこともありますが、
    外国語や今までにない制御が混ざってくるとかハードモードですよね。

    > 何も表示されないかもしくはちょっと隙間があくぐらいのまま
    この辺は一般的な挙動にするべきだし妥協せざるを得ないです。
    それに表示だけ対応するとしてもUnicodeは制御文字区画が
    きっぱり決まってるようにも思えず、労力に見合わなそうですね。

    > 使いやすいんじゃないかなと思って MS 製品に準拠したいとは思ってますw
    一般的な挙動に近づけるって割と重要なんですよね。
    特にテキストエディタのような普段使いのソフトだとタブの挙動はブラウザに近いとか
    そういう細かい点が近い/カスタマイズ出来るかでユーザーの合わせるコストが無くなるわけで。
    奇をてらわない現在のKuroさんの方針を支持します!

    > 面白い機能に自力で対応できたときはけっこーテンションあがりましたけどね!
    自分もWebやサーバー関係で実験の範囲ではテンション上げ上げなのですが、
    理想高すぎなのか成果物出すのは難しかったり、実験で満足しちゃうタイプなので、
    成果物を公開されている日曜プログラマの皆さんは凄いですね。……自分もいつかはw

     |  みじゅい  |  返信