Ticket #44424

結合文字が結合せずに表示されるため、スクリーンの表示幅が合わなくなる

Open Date: 2022-04-19 12:59 Last Update: 2022-05-07 12:31

Reporter:
Owner:
(None)
Type:
Status:
Open
Component:
MileStone:
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
11
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

Emacs の HELLO を表示し、C-l すると、1行目からではなく途中から表示されます。

  • AlmaLinux release 8.5
  • emacs-nox-26.1-7.el8.x86_64 / GNU Emacs 26.1 (build 1, x86_64-redhat-linux-gnu) of 2021-10-09

「記号を幅1で表示するか2で表示するの違いがあり、ひとつの行が端末の次の行まで続いて表示された結果、何行目まで表示されるかが変わる」というなら理解できます。しかし、最後に表示される行が異なるのではなく、最初に表示される行が異なるのには違和感を覚えます。

Tera Term 4 からの挙動なので、Tera Term 5 の開発で内部を Unicode 化したことによる問題ではなく、以前からある何らかの原因によるものと思われます。

Ticket History (3/19 Histories)

2022-04-19 12:59 Updated by: nmaya
  • New Ticket "データが途中から表示される" created
2022-04-19 13:01 Updated by: nmaya
  • File C-l_4.106.log (File ID: 9051) is attached
2022-04-19 13:30 Updated by: nmaya
  • File C-l_4.106.log (File ID: 9051) is deleted
2022-04-20 00:10 Updated by: doda
Comment

手元の環境では再現しませんでした。ウィンドウタイトルや、ログファイルの内容から想像するに、GNU Screenを間に挟んでいませんか?

以下、ログを読んだ結果です。

途中から表示される理由

Tera Termでの表示結果とPuTTYでの表示結果を比べると、Tear Termでは "Middle/Near East" や "South Asia", "South East Asia" などの行の次の行が空行になっています。

この空行が入る事によって全体の行数が増えた結果、上の方の行はスクロールアウトして見えなくなっています。

PuTTYでの表示もよく見ると South East Asiaの次に余計な空行が入っている為、一行目の This is a list of ways ~ という行がスクロールアウトして表示されていません。

空行が入る理由

背景色を黒以外に変更し、ウィンドウサイズを少し広げた状態でログをcatで表示すると何が起こっているか分かりやすいです。(添付 tt5-cat-log.png)

各行は表示する文字の部分だけではなく、背景色が黒の状態で(元の端末サイズでの)行末までスペースが出力されています。この挙動はおそらくGNU Screenの物だと思います。

その上で、余計な空行が入る前の行(South Asia等)を見ると、他の行より余計にスペースが出力されています。

これはGNU Screenが期待している表示幅とTera Termでの実際の表示幅が違う(Tera Termの方が広い)為、行末スペースを余計に出力している為だと思います。

その結果、余計なスペースで改行が発生して空行が入ってしまっています。

表示幅が違う理由

一部の結合文字が結合されずに表示されているように見えます。

例えば South East Asia: の直後ですが、 U+1787 BS U+1787 U+17C6 が出力されています。

この内最初のU+1787 は直後のBSで消える(重ね書きされる)ので無視し、後ろの U+1787 U+17C6 を考えます。

echo -e "\xe1\x9e\x87\xe1\x9f\x86" を実行すると上記2文字をUTF-8で出力されます。

この時PuTTYでは結合されて1桁で表示されますが、Tera Termでは結合されずに2桁として表示されます。

GNU ScreenもPuTTYと同じく1桁だと判断している為、画面での表示幅がずれていると思われます。

他の部分もほぼ結合されていないのが原因のように見えます。Europeの行のみ ¡ や ü ß が2桁として表示されているのが原因です。(これは曖昧文字幅の問題?)

(Edited, 2022-04-20 02:27 Updated by: doda)
2022-04-20 08:46 Updated by: nmaya
Comment

doda への返信

検証ありがとうございます。

まず、ご指摘の通り screen を挟んでいます。screen なしのログを添付します。

  • Screen version 4.06.02 (GNU) 23-Oct-17
  • zsh 5.5.1 (x86_64-redhat-linux-gnu)
  • Tera Term の設定「Japanese/UTF-8, 曖昧文字幅2」

途中から表示される理由

桁がはみ出した結果として行数があふれた場合に、下ではなく上に向かってはみ出すというのが私の直感には反したのですが、そういうことがある、ということですね。

結合文字

確かに「点線の○にヒゲのような記号」は結合されるべき文字ですね。Middle/Near East, South Asia, South East Asia の4行はこれが原因に見えます。

ヘブライ語などのLTRが悪さをしているかと思いましたが、Middle/Near Eastの行は1文字ぶんしかはみ出していないのでそれは大丈夫そうな気がしています。

あいまい文字幅

「Setup」「Additional Settings」「coding」「Ambiguous Characters width」を1にすると、Europeの「¡, ü, ß」が1桁で表示されました。

Tera Term を改善できる点としては「結合文字が結合されていない」という理解をしました。

それ以外の部分で、Unicode charsetの行のロシア語のЗдравствуйте!がйとтの間で\で改行されているので emacs は2桁を想定しているように見えます。Europeのために曖昧文字幅を1にすると、キリル文字やギリシャ文字がつぶれることになるのですが、これはフォントの問題になるでしょうか?

2022-04-21 03:01 Updated by: doda
Comment

桁がはみ出した結果として行数があふれた場合に、下ではなく上に向かってはみ出すというのが私の直感には反したのですが、そういうことがある、ということですね。

上にはみ出すというか、余計な改行が発生した時点では下に行が増えますが、その結果早く画面下端に着くのでそれ以降の表示で画面全体がスクロールしているという事です。

最終的な表示だけからでは分かりづらいですが、描画していく過程が見えると理解しやすいかもしれません。

添付の C-l_5alpha.tty は描画の過程を分かりやすくする為に以下を行ったttyrec形式のログです。

  • 表示にwaitを入れた
  • カーソル非表示シーケンスを潰した (カーソルの現在位置を分かりやすくする為)
  • 最初に画面全体に色を付ける (スペースの出力を分かりやすくする為)

これを見ると何が起きているのか分かりやすいと思います。

Europeのために曖昧文字幅を1にすると、キリル文字やギリシャ文字がつぶれることになるのですが、これはフォントの問題になるでしょうか?

JIS X 0208 にキリル文字やギリシャ文字が収録されている関係で、日本語用のフォントではこれらの文字が全角でデザインされている事が多いです。 これを半角で表示する為、文字の右側が切れて表示されます。

Ricty DiminishedHackGen Console などのように、半角としてデザインされているフォントを使うと綺麗に表示できます。

全角でデザインされているフォントでも比較的問題なく表示出来るようにする為には、PuTTYのように横方向に圧縮するというのが有ります。特に→は右側が切れるとハイフンに見えてしまうので、圧縮して表示する機能は欲しいですね。

2022-04-22 18:21 Updated by: nmaya
Comment

その結果早く画面下端に着くのでそれ以降の表示で画面全体がスクロールしている

描画していく過程が見えると理解しやすいかもしれません。

よくわかりました。1,1 の位置で C-l しているので、頭の中でそこが基準になってしまっていました。

半角としてデザインされているフォント

HackGen Console に設定したら半角になりました。カーソルを進めると2桁ぶん進んだり、表示が右端に到達する桁数がずれるのも、emacs を設定(と、挟んでいれば screen の設定も)すれば解消できるのだろうと理解しました。

他の端末エミュレータとの比較

emacs の view-hello-file がどのように表示されるのか、端末エミュレータの表示を比べてみました。

  • 共通
    • screen:なし
    • フォント:HackGen Console
  • Tera Term 5 alpha1
    • coding:Japanese/UTF-8
    • 曖昧文字幅:1
    • Font Quality:Clear Type
  • PuTTY gdi-2021-07-19
    • Window - Translation:UTF-8(UTF-8/CJK にすると幅が2になるのでそれは選択しない)
  • RLogin 2.26.9
    • 文字セット:UTF8
Tera Term PuTTY RLogin
結合文字 結合されず次の位置に表示される
カーソルは"結合されて1文字"のカウントで進む(行末があわず手前でぶつかる)
すべての結合文字に非対応なわけではない?
結合して表示される
カーソルは"結合されて1文字"のカウントで進む(行末があう)
結合されているようだが、結合された文字は表示されない
カーソルは"結合されて1文字"のカウントで進む(行末があう)
LTR 「שלום」が正しく並んでいる
"East: "から右にカーソルを進めていくと、右端に進んで左に戻ってくる
「שלום」が逆順に並んでいる
ヘブライ語とアラビア語の位置が逆になっている(中立文字のカンマとスペースをRTL扱いしてしまっている?)
"East: "から右にカーソルを進めていくと、右端に進んで左に戻ってくる
「שלום」が逆順に並んでいる
"East: "から右にカーソルを進めていくと、右端に進んで左に戻ってくる
その他 ベトナム語のbạnのạが半分切れて表示される
ヘブライ語の文字が半分切れて表示される
C-lで5行スクロールアウトする(Middle/Near East,South Asia(2行),South East Asia, Arabicの行)
ベトナム語のbạnのạが半分切れて表示される
C-lで1行スクロールアウトする(South East Asia の行)
アラビア語が表示されない
ベトナム語のbạnのạが半分切れて表示される
C-lでスクロールアウトしない

スクロールアウトのせいで、カーソルが見えている行とカーソルが実際にある行がズレていると思いますが、それを脳内で補正して位置を数えています。

上記の動作は、私がアプリやemacsを設定に適切していないためにそうなっている可能性もあります。

  • ベトナム語の「ạ」:フォントが全角幅を持っている?
  • ヘブライ語の文字:フォントが全角幅を持っている?ほかの端末エミュレータでは表示されるので、フォント以外に原因がある?(たとえば、ほかの端末エミュレータでは、ヘブライ語には横圧縮がかかるけどベトナム語には横圧縮がかからない、とか?)

Attachment File List

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login