チケット #48226

不正な UTF-8 受信時の動作

登録: 2023-06-13 00:36 最終更新: 2023-10-16 01:38

報告者:
担当者:
チケットの種類:
状況:
完了
コンポーネント:
マイルストーン:
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし
投票
点数: 0
No votes
0.0% (0/0)
0.0% (0/0)

詳細

(ticket #17226 から発展したチケットです)

TERATERM.INIのTera TermセクションにFallbackToCP932=ON/OFF設定がありま す。これは、不正な UTF-8 を受信したとき、日本語設定の時は CP932(Shift_JIS)としてあつかう(Fallback)することで設定ミスによる文字化 けを減らそうとするもので、デフォルトはOFFです。

ticket #17226の修正でも不正なUTF-8を受信した場合、ISO8859-1にFallback していました。

(文字コードを変換する先がないので、そのまま出力していて、 0xffまでの範囲ではUnicodeはISO8859-1と同じなのでFallbackしていたことに なります)

Fallbackするかしないかは(FallbackToCP932が設定であったように)ユーザー が決められるようにしたほうが良いと思います。

Fallbackする場合の動作は妥当そうな文字コードを受信したとして処理する (日本語環境の時CP932、英語環境の時ISO8859-1など)方法か、ユーザーが指定 する(CP932へFallbackなどと指定する)方法が思いつきます。どちらが良いで しょうか?

Fallbackしない場合の動作は次のような候補が考えられます。

  • "?"を出力
  • U+2592 MEDIUM SHADE を出力 (PuTTY)
  • 何も表示しない (conhost.exe)
  • U+FFFD REPLACEMENT CHARACTER を出力(Windows Terminal)

これもユーザーが選べるのがよいでしょうか。 (echo -e "\xc0" として各端末ソフトでテストしました)

多分「Fallbackしない、"?"などの何らかの文字を出力する」というのが 一番よくつかわれる設定になるのではないかと思います。

まずは、Fallbackしない、不正なUTF-8を受信したこと後を示す文字を出力で きるように修正しようと思います。

チケットの履歴 (14 件中 3 件表示)

2023-06-13 00:36 更新者: zmatsuo
  • 新しいチケット "不正な UTF-8 受信時の動作" が作成されました
2023-06-15 00:38 更新者: zmatsuo
コメント

受信文字コードがUTF-8の時の不正な文字チェックを修正して、Fallback/不正 な文字出力を実装しました。r10763, r10764です。

UTF-8受信時の出力文字はとりあえ "?" にしました。

次のような動作になります

$ echo -e "\xe3\x82\xa2"
# "ア" (UTF-8 0xe3 0x82 0xa2 = U+30A2)

$ echo -e "\xe3"
#   FallbackToCP932=OFF時
# "?" (不正な文字)
#   FallbackToCP932=ON時
# "ã" (ISO8859-1 0xe3)

$ echo -e "\xe3A\xe3\x82\xa2"
#   FallbackToCP932=OFF時
# "?Aア" (不正な文字 "A" UTF-8 0xe3 0x82 0xa2 = U+30A2)
#   FallbackToCP932=ON時
# "ãAア" (ISO8859-1 0xe3 "A" UTF-8 0xe3 0x82 0xa2 = U+30A2)

$ echo -e "\xe3\xe3\x82\xa2"
#   FallbackToCP932=OFF時
# "?ア" (不正な文字 UTF-8 0xe3 0x82 0xa2 = U+30A2)
#   FallbackToCP932=ON時
# "ãア" (ISO8859-1 0xe3 UTF-8 0xe3 0x82 0xa2 = U+30A2)

$ echo -e "\xe3A\x82\xa2"
#   FallbackToCP932=OFF時
# "?A??" (不正な文字 A 不正な文字x2)
#   FallbackToCP932=ON時
# "ãAい" (ISO8859-1 0xe3 A Shift_JIS 0x82a2)
2023-06-16 23:16 更新者: zmatsuo
コメント

Unicodeの仕様書を参考にさらに厳密にしました。r10766 です。

サロゲートペアも不正とみなすようになりました。

2023-06-18 00:42 更新者: zmatsuo
コメント

ISO8859-1等に設定したときに一部の文字(C1)を表示しようとしてクラッシュ することがあったので修正しました。r10770です。

現在(r10772)の動作は次のようになっています。

こう変更したらどうかなと思います。

  • TERATERM.INI の設定
    • UTF8Fallback=ON/OFF
      • ON/OFF = Fallbackする/しない(デフォルト)
    • FallbackToCP932があったら読み込む
      • ただしUTF8Fallbackがあったらそちらを優先する
      • 保存はUTF8Fallbackに行われる
2023-07-02 01:55 更新者: None
コメント

誤って assert() することがあったので修正しました

2023-07-03 01:12 更新者: zmatsuo
コメント

設定を UTF8Fallback からも読み込むようにしました。

FallbackToCP932 は保存されていませんでした。(設定するUIがないので内容が変化しないため保存は不要なため)

UTF8Fallback も同様に保存しないようにしました。

r10794 です。

2023-07-05 01:10 更新者: doda
コメント

FallbackToCP932はCygwin接続時にWindows付属コマンドの出力がCP932で行われる事に対応する為に入れたものであり、それ以外のケースは想定していません。

#17226 でも少し書いていますが、本来表示出来ないはずの物が表示出来てしまうのはセキュリティ的に問題となる場合があります。

FallbackToCP932は必要に迫られて入れましたが、他のコードへのFallbackは具体的な問題/要望が無い限り機能自体を入れたく無いです。(たとえデフォルトがoffだとしても)

2023-07-05 01:17 更新者: doda
コメント

zmatsuo への返信

UTF8Fallback も同様に保存しないようにしました。

読み込むけれど保存時に書き込まない設定は、期待通りに動作しない場合があります。

FallbackToCP932が想定しているCygwin接続ではその問題を踏む事は無いので気にしていませんでしたが、

UIでは変更出来ないRead-Onlyな設定でも、特別な理由が無い限り設定の保存時には書き込むようにしてください。

2023-07-05 01:32 更新者: doda
コメント

Fallbackしない場合の動作は次のような候補が考えられます。

他の候補としては「U+2E2E Reversed Question Mark を出力」というのが考えられます。

VT382が不正な文字に対してこれを表示するようになっています。

c.f. https://twitter.com/ttdoda/status/275634822947422208

* "?"を出力

? 自体が良く使われる文字であり、不正なコードが有ったのか見た目から判断が付きづらいので避けた方がいいように思います。

何も出力しないというのも分かりづらいので、

U+FFFD REPLACEMENT CHARACTER を出力(Windows Terminal)

これが一番妥当なように思います。

2023-07-06 00:10 更新者: zmatsuo
コメント

FallbackToCP932はCygwin接続時にWindows付属コマンドの出力がCP932で行われる事に対応する為に入れたものであり、それ以外のケースは想定していません。

特別な理由が無い限り設定の保存時には書き込むようにしてください。

U+FFFD REPLACEMENT CHARACTER を出力(Windows Terminal)

これが一番妥当なように思います。

了解です。UTF8FallbackはやめてFallbackToCP932に戻したほうがよさそうですね。

次の修正を行おうと思います。

  • キーの名前をUTF8FallbackはやめてFallbackToCP932に戻す
  • 日本語UTF-8のときだけとする
  • ini書き込み時FallbackToCP932に書き出す
  • 変換できない文字の場合 U+FFFD を表示("?"はやめる)
2023-07-07 02:16 更新者: doda
コメント

読み込むが書き込まない設定がどのように問題になるかを共有する為、問題が発生するケースを書いておきます。

まず直接の問題ですが、[設定]-[設定の保存]で新しいファイルを指定した時に書き込まれない設定内容が失われます。

次に上記から派生する問題ですが、ホストに接続後に[ファイル]-[新しい接続]で別ウィンドウを開く時に、
TTXSSHは現在の設定を一時ファイルに書き出して、それを/ssh-consume= オプションで読み込むという動作をします。

その結果、書き込まれない設定が引き継がれなくてデフォルトの値が使われてしまいます。

後者はTTXSSH関連の設定のみが対象となりますが、よく使う操作なので影響を受ける事が多いと思います。

2023-07-08 01:18 更新者: zmatsuo
コメント

キーの名前をUTF8FallbackはやめてFallbackToCP932に戻す

日本語UTF-8のときだけとする

ini書き込み時FallbackToCP932に書き出す

変換できない文字の場合 U+FFFD を表示("?"はやめる)

r10800, r10801 で修正を行いました。

U+FFFD は Ambiguous な文字幅なんですね。

2023-07-08 01:34 更新者: zmatsuo
コメント

INIファイルへ書き込みができないと問題が出る場合があること理解しました。 ありがとうございます。

セッションの複製はなかなか難しい処理だな思っています。

2023-10-16 01:38 更新者: zmatsuo
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする