不正な UTF-8 受信時の動作
受信文字コードが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)
Unicodeの仕様書を参考にさらに厳密にしました。r10766 です。
サロゲートペアも不正とみなすようになりました。
ISO8859-1等に設定したときに一部の文字(C1)を表示しようとしてクラッシュ することがあったので修正しました。r10770です。
現在(r10772)の動作は次のようになっています。
こう変更したらどうかなと思います。
誤って assert() することがあったので修正しました
設定を UTF8Fallback からも読み込むようにしました。
FallbackToCP932 は保存されていませんでした。(設定するUIがないので内容が変化しないため保存は不要なため)
UTF8Fallback も同様に保存しないようにしました。
r10794 です。
FallbackToCP932はCygwin接続時にWindows付属コマンドの出力がCP932で行われる事に対応する為に入れたものであり、それ以外のケースは想定していません。
#17226 でも少し書いていますが、本来表示出来ないはずの物が表示出来てしまうのはセキュリティ的に問題となる場合があります。
FallbackToCP932は必要に迫られて入れましたが、他のコードへのFallbackは具体的な問題/要望が無い限り機能自体を入れたく無いです。(たとえデフォルトがoffだとしても)
zmatsuo への返信
UTF8Fallback も同様に保存しないようにしました。
読み込むけれど保存時に書き込まない設定は、期待通りに動作しない場合があります。
FallbackToCP932が想定しているCygwin接続ではその問題を踏む事は無いので気にしていませんでしたが、
UIでは変更出来ないRead-Onlyな設定でも、特別な理由が無い限り設定の保存時には書き込むようにしてください。
Fallbackしない場合の動作は次のような候補が考えられます。
他の候補としては「U+2E2E Reversed Question Mark を出力」というのが考えられます。
VT382が不正な文字に対してこれを表示するようになっています。
c.f. https://twitter.com/ttdoda/status/275634822947422208
* "?"を出力
? 自体が良く使われる文字であり、不正なコードが有ったのか見た目から判断が付きづらいので避けた方がいいように思います。
何も出力しないというのも分かりづらいので、
U+FFFD REPLACEMENT CHARACTER を出力(Windows Terminal)
これが一番妥当なように思います。
FallbackToCP932はCygwin接続時にWindows付属コマンドの出力がCP932で行われる事に対応する為に入れたものであり、それ以外のケースは想定していません。
特別な理由が無い限り設定の保存時には書き込むようにしてください。
U+FFFD REPLACEMENT CHARACTER を出力(Windows Terminal)
これが一番妥当なように思います。
了解です。UTF8FallbackはやめてFallbackToCP932に戻したほうがよさそうですね。
次の修正を行おうと思います。
読み込むが書き込まない設定がどのように問題になるかを共有する為、問題が発生するケースを書いておきます。
まず直接の問題ですが、[設定]-[設定の保存]で新しいファイルを指定した時に書き込まれない設定内容が失われます。
次に上記から派生する問題ですが、ホストに接続後に[ファイル]-[新しい接続]で別ウィンドウを開く時に、
TTXSSHは現在の設定を一時ファイルに書き出して、それを/ssh-consume= オプションで読み込むという動作をします。
その結果、書き込まれない設定が引き継がれなくてデフォルトの値が使われてしまいます。
後者はTTXSSH関連の設定のみが対象となりますが、よく使う操作なので影響を受ける事が多いと思います。
INIファイルへ書き込みができないと問題が出る場合があること理解しました。 ありがとうございます。
セッションの複製はなかなか難しい処理だな思っています。
(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しない場合の動作は次のような候補が考えられます。
これもユーザーが選べるのがよいでしょうか。 (echo -e "\xc0" として各端末ソフトでテストしました)
多分「Fallbackしない、"?"などの何らかの文字を出力する」というのが 一番よくつかわれる設定になるのではないかと思います。
まずは、Fallbackしない、不正なUTF-8を受信したこと後を示す文字を出力で きるように修正しようと思います。