LoginSignup
1
1

More than 1 year has passed since last update.

TeraTerm で罫線をクリップボードにコピーすると文字化けする件

Posted at

序文

この手の話をすると、「TeraTerm」「文字化け」の単語だけに反応し、「Linux側の文字コードの設定ガー」「TeraTerm 側の漢字受信コードの設定ガー」と早とちりする人がいる。
それはTeraTerm上での(日本語)表示の文字化けの話では。そんなことは 1ドットも言ってないという。
あくまでも表示は正常。しかし、それをマウスで選択コピーし、テキストエディタに張り付けると文字化けすることが、って話ね。

前回の投稿pstreeコマンドを多用したけど、ツリー表示のコピーでちょっと躓いて色々と調べたので備忘録として残す。ぐぐれば断片的に情報は見つかるけど、総合的なものは無かったので。
環境は前回の投稿同様。

現象

Linux側の文字コードとTeraTermの漢字受信コードの設定は以下の通り。(UTF8)
2022-04-09 (1).png
pstreeコマンドでのツリー表示は正常。
01.png
しかし、TeraTerm上をマウスで選択コピーしテキストエディタに貼り付けると文字化け。(厳密には文字化けとは違うらしいけど)
02.png
ログファイル上も同様。
15.png

原因

公式に書いてある。
ターミナルエミュレーション (Tera Term 設定ファイル)

UnicodeからDEC特殊文字へのマッピングを設定する

日本語環境ではTera Termは罫線や一部の記号を2カラム幅で表示します。
ただし、マウスで選択した時にクリップボードにコピーされるのが本来とは別の文字になってしまうという副作用があります

対応方法1 - TeraTerm の設定変更

上記の公式に書いてある通りで、デフォルトの設定はUnicodeToDecSpMapping=3となっている。
03.png
これをUnicodeToDecSpMapping=0等に変更し、変換設定を止める。
因みに、TeraTermの実行形式が配置されているフォルダ上のTERATERM.INIを変更しても反映されないので注意。(TeraTermあるある)
ユーザー毎の設定ファイル側を変更すること。

参考URL:
Teratermの設定ファイル _ らぼらとり・ちー

C:\Program Files\teraterm\TERATERM.INI
を変更したのに、反映されない。
実は
C:\Users\chisaya\AppData\Local\VirtualStore\Program Files\teraterm
にあるファイルが優先されていて先のファイルをいくらいじってもダメというおちでした。64bit windowsだと次の通り
C:\Users\chisaya\AppData\Local\VirtualStore\Program Files (x86)\teraterm

設定を変更し、pstreeコマンドを再実行した結果が以下。
04.png
うーん、表示がずれているし。罫線の縦棒も隙間が空いている。しかし、クリップボードへのコピーで文字化けは無くなる。
05.png
それにしてもデフォルトの設定では巧みに表示が補正されていたんだねぇ。今更気付くTeraTermのありがたみ。

対応方法2 - ファイルに書き出す

TeraTermの設定変更は表示が少し残念になってしまう。表示はそのままで(設定は変更せず)、文字化けを回避したい。
ということで原始的だけどファイルに書き出す方法もある。これなら表示設定に左右されない。


サーバー側でファイルに出力。
06.png


クライアント側からサーバーのファイルを参照。
07.png
今回の罫線の問題に限らず、汎用的な方法。

対応方法3 - 他のSSHクライアントを利用

TeraTermを使わなければならない、という法律がある訳でもなく。Windows10ならSSHクライアントがデフォルトで利用可。
Windows10に標準搭載されたSSHコマンドの基本的な使い方 _ 4thsight.xyz
SSH を使用して接続する _ Microsoft Docs

以下はコマンドプロンプト上からの接続例。
08.png
しかし表示がちょっと残念。横棒が文字に突き刺さっているし。それでもコピペに問題はない模様。
09.png

TeraTermに次いで人気が高いのがRLoginかな。
rlogin_telnet_ssh(クライアント)ターミナルソフト

こちらでも確認。(設定はデフォルト)
10.png
11.png
画面表示、コピペに問題は無かった。RLoginに乗り換えますかねぇ。

対応方法4 - サーバーサイドからクライアントのクリップボードへコピー

そもそも論として、TeraTermの標準設定ではクリップボードへのコピーで文字化けすることが原因。TeraTerm自体のコピー機能は通さずクリップボードにコピーする方法はないか。ぐーぐる先生の御神託が以下。
Tera Term でクリップボードにコピー - skaji's blog

Tera Term を使ってリモートで作業してるとき、Mac の pbcopy のようにクリップボードに標準入力から受け取ったデータをコピーしてくれるコマンドがあったら便利だなと思う事がしょっちゅうある。

リモートの tmux でコピーした内容のローカルのクリップボードへの反映 | doda's blog
によるとクリップボード設定用制御文字列というのがすでにTera Termで使えるらしく、実際簡単にpbcopyコマンドっぽいのが作れた。

GitHub上でも公開されている。
TeraTerm でクリップボードにコピー

へー、こんなことが出来るんだね。勿論、サーバーサイドが接続元のクライアントのメモリ(クリップボード)に直接アクセスできる訳はない。
それこそ、
14.png
みたいな話で。なわけねぇだろっていう。
「クリップボード設定用制御文字列」なるものがサーバーから送信電文として送られてくると、それを受信したTeraTermがクリップボードに吐き出す、という理屈と思われ。

実際に試してみたのが以下。
12.png
上記のように実行するとクライアント側(Windows上)で以下が表示されるのが目印。
2022-04-09.png
テキストエディタ上でペースト。
13.png
凄いよこれ。チョー便利なんですけど。
但し欠点も。上記サイトにあるように上限が 4 KB (4096 Byte)。

多分 encode_base64 した後の 4 KB (4096 Byte) までのデータしかコピーできない。

それとscreenコマンドのセッション上では正しく動かない。
上記サイトを受けてPHP版を公開している方も居た。
TeraTermでリモートからローカルのクリップボードにコピー by PHP - Software Defined Laboratory

こちらも確認したけど、やはり同様の上限だった。仕様上の制限っぽいですな。
更に色々と確認していると、もっと上限が低いケースも。うーん。謎。

その他 - vim

vivim)でもクリップボードコピーができるんだね。以下参照。
リモートのVimからssh越しにクリップボード書き込み - tateren’s diary

わりと皆やりたがるやつ。
OSC52という端末の制御シーケンスでクリップボードアクセスができるらしい。

こちらも試してみたらPi OS環境ではエラーを吐いて動かず。以下によるとcompact version(簡易版)だかららしい。
vimrc エラー Ubuntu _ Awesome Blog

vimカスタマイズエラー対応

現在のvimを確認
「vim-tiny」行の最後に「- compact version」の記載があるのがわかると思います。
ubuntuにデフォルトで入っているvimはこの簡易版のためエラーがでたということです。

Pi OSの環境は以下。確かに簡易版だね。Pi OSUbuntuDebian系だから同じ話。

$ which vi
/usr/bin/vi
$ ls -la /usr/bin/vi
lrwxrwxrwx 1 root root 20 10月 30 21:28 /usr/bin/vi -> /etc/alternatives/vi
$ ls -la /etc/alternatives/vi
lrwxrwxrwx 1 root root 17 10月 30 21:28 /etc/alternatives/vi -> /usr/bin/vim.tiny
$ dpkg -l | grep vim
ii  vim-common                             2:8.2.2434-3+deb11u1              all          Vi IMproved - Common files
ii  vim-tiny                               2:8.2.2434-3+deb11u1              arm64        Vi IMproved - enhanced vi editor - compact version

今まで漠然とvivim)と思っていたけど実はvim-tinyだったでござる。

自分もここら辺の仕組みは分かっていなかったので、この件も改めて調べ確認してみた。
上記サイトでは、わざわざ明示的に簡易版vimvim-tiny)をアンインストールし、通常版vimを入れたりしているけど、実は単にsudo apt install vimで追加インストールすれば良いだけだった。
そもそもパッケージ自体、通常版はvim、簡易版はvim-tinyと異なる名称で管理されている。

$ apt-cache search vim | grep ^vim
vim - Vi IMproved - 強化版 vi エディタ                          <-- 通常版
vim-common - Vi IMproved - 共通ファイル
vim-doc - Vi IMproved - HTML ドキュメント
vim-gui-common - Vi IMproved - GUI 共通ファイル
vim-runtime - Vi IMproved - ランタイムファイル
vim-tiny - Vi IMproved - 強化版 vi エディタ - コンパクト版       <-- 簡易版
(以下略)

そして同一カテゴリ(今回の場合はテキストエディタ)で複数のパッケージを管理する仕組みがあり、更に言えば同一ツール(今回の場合はvi)で複数の実行ファイル、複数のバージョンを管理する仕組みがあり、既存のvimvim.tiny)はそのままで、追加インストールされたvimvim.basic)と共存され、追加インストール版の優先順位が上になる。元に戻したければupdate-alternativesコマンドで再設定できる。

追加インストール前
$ sudo update-alternatives --config vi
リンクグループ vi に 1 つの alternative のみがあります (/usr/bin/vi が提供): /usr/bin/vim.tiny
設定は行いません。
追加インストール後
$ sudo update-alternatives --config vi
alternative vi (/usr/bin/vi を提供) には 2 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /usr/bin/vim.basic   30        自動モード
  1            /usr/bin/vim.basic   30        手動モード
  2            /usr/bin/vim.tiny    15        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:

vim.basicが通常版vim


テキストエディタの選択肢。

追加インストール前
$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.tiny
追加インストール後
$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.basic
/usr/bin/vim.tiny

リンクはシステムが設定してくれる。というか手動で操作するべきではない。
追加インストール後
$ ls -la /etc/alternatives/vi
lrwxrwxrwx 1 root root 18  4月 10 02:57 /etc/alternatives/vi -> /usr/bin/vim.basic
$ dpkg -l | grep vim
ii  vim                                    2:8.2.2434-3+deb11u1              arm64        Vi IMproved - enhanced vi editor
ii  vim-common                             2:8.2.2434-3+deb11u1              all          Vi IMproved - Common files
ii  vim-runtime                            2:8.2.2434-3+deb11u1              all          Vi IMproved - Runtime files
ii  vim-tiny                               2:8.2.2434-3+deb11u1              arm64        Vi IMproved - enhanced vi editor - compact version

そしてvim上からのクリップボードコピーを試してみた。確かにTeraTermではcp932変換が必要だった。TeraTerm用osc52.vim(osc52_for_teraterm.vim)はGitHub上に置いた。

TeraTerm用osc52.vim(osc52_for_teraterm.vim)
$ wget https://github.com/god1964/RaspberryPi/raw/main/TeraTerm/osc52_for_teraterm.vim

$ ls -la osc52_for_teraterm.vim
-rw-r--r-- 1 pi pi 4310  4月 10 08:14 osc52_for_teraterm.vim
$ cat ~/.vimrc
" source ~/osc52.vim
source ~/osc52_for_teraterm.vim
vmap <C-c> y:call SendViaOSC52(getreg('"'))<cr>

それと、screenコマンドのセッション上でかつ一定以上の文字数の場合、コピーできない模様(TeraTermRLogin共に)。どうもクリップボードコピーはscreenコマンドと相性が悪い。セッション上ではなくてもやはり上限はあり。

今回も色々と勉強になったよ。

参考URL:
update-alternatives(8) — dpkg — Debian jessie — Debian Manpages
update-alternativesの使い方(vimをeditorグループに登録する) - やってみる
How can I add my desired editor to the update-alternatives interactive menu_ - Ask Ubuntu

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1