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

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

[前回の投稿](https://qiita.com/god19/items/87d41cdeb8c0d5d4f75c "Raspberry Pi4 screenセッションの確認方法 - Qiita")で`pstree`コマンドを多用したけど、ツリー表示のコピーでちょっと躓いて色々と調べたので備忘録として残す。ぐぐれば断片的に情報は見つかるけど、総合的なものは無かったので。
環境は前回の投稿同様。

## 現象
`Linux`側の文字コードと`TeraTerm`の漢字受信コードの設定は以下の通り。（UTF8）
![2022-04-09 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/c25d7bda-c260-852f-dd4b-28ea67a4d965.png)
`pstree`コマンドでのツリー表示は正常。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/028d7dad-8b16-ee4c-55ee-25259893baf5.png)
しかし、`TeraTerm`上をマウスで選択コピーしテキストエディタに貼り付けると文字化け。（厳密には文字化けとは違うらしいけど）
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/dc34a2cd-3713-98a4-bd74-83b6f3e21418.png)
ログファイル上も同様。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/02907c97-15eb-c44b-9e59-c781d09b8932.png)

## 原因
公式に書いてある。
[ターミナルエミュレーション (Tera Term 設定ファイル)](https://ttssh2.osdn.jp/manual/4/ja/setup/teraterm-term.html "ターミナルエミュレーション (Tera Term 設定ファイル)")
> ### UnicodeからDEC特殊文字へのマッピングを設定する
> 日本語環境ではTera Termは罫線や一部の記号を2カラム幅で表示します。
> ただし、`マウスで選択した時にクリップボードにコピーされるのが本来とは別の文字になってしまうという副作用があります`。

## 対応方法1 - TeraTerm の設定変更
上記の公式に書いてある通りで、デフォルトの設定は`UnicodeToDecSpMapping=3`となっている。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/16866f4b-92a0-389c-6ab0-2fbcf77f7448.png)
これを`UnicodeToDecSpMapping=0`等に変更し、変換設定を止める。
因みに、`TeraTerm`の実行形式が配置されているフォルダ上の`TERATERM.INI`を変更しても反映されないので注意。（`TeraTerm`あるある）
ユーザー毎の設定ファイル側を変更すること。

参考URL：
[Teratermの設定ファイル _ らぼらとり・ちー](https://chi-labo.info/2017/teraterm/ "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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/a273d66e-5bf2-5bb4-f237-517ab365134a.png)
うーん、表示がずれているし。罫線の縦棒も隙間が空いている。しかし、クリップボードへのコピーで文字化けは無くなる。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/b4508875-5d4a-0f6c-9b26-a5e8abfd1946.png)
それにしてもデフォルトの設定では巧みに表示が補正されていたんだねぇ。今更気付く`TeraTerm`のありがたみ。

## 対応方法2 - ファイルに書き出す
`TeraTerm`の設定変更は表示が少し残念になってしまう。表示はそのままで（設定は変更せず）、文字化けを回避したい。
ということで原始的だけどファイルに書き出す方法もある。これなら表示設定に左右されない。
<BR>
サーバー側でファイルに出力。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/feb9e300-58bf-30ee-2b93-5e3bb2a9236f.png)
<BR>
クライアント側からサーバーのファイルを参照。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/faf8b254-cc93-1dca-8201-85c73f5eccb5.png)
今回の罫線の問題に限らず、汎用的な方法。

## 対応方法3 - 他の`SSH`クライアントを利用
`TeraTerm`を使わなければならない、という法律がある訳でもなく。`Windows10`なら`SSH`クライアントがデフォルトで利用可。
[Windows10に標準搭載されたSSHコマンドの基本的な使い方 _ 4thsight.xyz](https://4thsight.xyz/2783 "Windows10に標準搭載されたSSHコマンドの基本的な使い方 _ 4thsight.xyz")
[SSH を使用して接続する _ Microsoft Docs](https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/factoryos/connect-using-ssh?view=windows-11 "SSH を使用して接続する _ Microsoft Docs")

以下はコマンドプロンプト上からの接続例。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/89df979f-0e67-b855-2b57-d2755b2acc4a.png)
しかし表示がちょっと残念。横棒が文字に突き刺さっているし。それでもコピペに問題はない模様。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/515e81f4-89cd-50a1-83a0-2f3f9464af14.png)

`TeraTerm`に次いで人気が高いのが`RLogin`かな。
[rlogin_telnet_ssh(クライアント)ターミナルソフト](https://kmiya-culti.github.io/RLogin/ "rlogin_telnet_ssh(クライアント)ターミナルソフト")

こちらでも確認。（設定はデフォルト）
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/a2e8af5a-52c7-1ef0-90a2-6d597562513c.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/89c848e3-32f6-e7a2-464a-44cf7009aaf0.png)
画面表示、コピペに問題は無かった。`RLogin`に乗り換えますかねぇ。

## 対応方法4 - サーバーサイドからクライアントのクリップボードへコピー
そもそも論として、`TeraTerm`の標準設定ではクリップボードへのコピーで文字化けすることが原因。`TeraTerm`自体のコピー機能は通さずクリップボードにコピーする方法はないか。ぐーぐる先生の御神託が以下。
[Tera Term でクリップボードにコピー - skaji's blog](https://ks0608.hatenablog.com/entry/2012/09/15/054134 "Tera Term でクリップボードにコピー - skaji's blog")
> Tera Term を使ってリモートで作業してるとき、Mac の pbcopy のようにクリップボードに標準入力から受け取ったデータをコピーしてくれるコマンドがあったら便利だなと思う事がしょっちゅうある。
> 
> リモートの tmux でコピーした内容のローカルのクリップボードへの反映 | doda's blog
> によるとクリップボード設定用制御文字列というのがすでにTera Termで使えるらしく、実際簡単にpbcopyコマンドっぽいのが作れた。

GitHub上でも公開されている。
[TeraTerm でクリップボードにコピー](https://gist.github.com/skaji/3724492 "TeraTerm でクリップボードにコピー")

へー、こんなことが出来るんだね。勿論、サーバーサイドが接続元のクライアントのメモリ（クリップボード）に直接アクセスできる訳はない。
それこそ、
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/aca93e14-4a3d-f3af-49f7-1edb48f9fce4.png)
みたいな話で。なわけねぇだろっていう。
「クリップボード設定用制御文字列」なるものがサーバーから送信電文として送られてくると、それを受信した`TeraTerm`がクリップボードに吐き出す、という理屈と思われ。

実際に試してみたのが以下。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/29d97765-7d55-a6e7-5457-a68cdb93652e.png)
上記のように実行するとクライアント側（Windows上）で以下が表示されるのが目印。
![2022-04-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/723d9c9f-a289-cd49-900e-45cc9faaf732.png)
テキストエディタ上でペースト。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/4cab08ea-a724-a4a3-f0eb-3672a179057d.png)
凄いよこれ。チョー便利なんですけど。
但し欠点も。上記サイトにあるように上限が 4 KB (4096 Byte)。
> 多分 encode_base64 した後の 4 KB (4096 Byte) までのデータしかコピーできない。

それと`screen`コマンドのセッション上では正しく動かない。
上記サイトを受けて`PHP`版を公開している方も居た。
[TeraTermでリモートからローカルのクリップボードにコピー by PHP - Software Defined Laboratory](http://sdlabo.org/TeraTerm%E3%81%A7%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%8B%E3%82%89%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%20by%20PHP.html "TeraTermでリモートからローカルのクリップボードにコピー by PHP - Software Defined Laboratory")

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

## その他 - vim
`vi`（`vim`）でもクリップボードコピーができるんだね。以下参照。
[リモートのVimからssh越しにクリップボード書き込み - tateren’s diary](https://tateren.hateblo.jp/entry/2017/07/21/213020 "リモートのVimからssh越しにクリップボード書き込み - tateren’s diary")
> わりと皆やりたがるやつ。
> OSC52という端末の制御シーケンスでクリップボードアクセスができるらしい。

こちらも試してみたら`Pi OS`環境ではエラーを吐いて動かず。以下によると`compact version`（簡易版）だかららしい。
[vimrc エラー Ubuntu _ Awesome Blog](https://awesome-linus.com/2017/08/14/ubuntu-vim-customize-error/ "vimrc エラー Ubuntu _ Awesome Blog")
> ### vimカスタマイズエラー対応
> 現在のvimを確認
> 「vim-tiny」行の最後に「- compact version」の記載があるのがわかると思います。
> ubuntuにデフォルトで入っているvimはこの簡易版のためエラーがでたということです。

`Pi OS`の環境は以下。確かに簡易版だね。`Pi OS`も`Ubuntu`も`Debian`系だから同じ話。
```shell
$ 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
```

今まで漠然と`vi`（`vim`）と思っていたけど実は`vim-tiny`だったでござる。

自分もここら辺の仕組みは分かっていなかったので、この件も改めて調べ確認してみた。
上記サイトでは、わざわざ明示的に簡易版`vim`（`vim-tiny`）をアンインストールし、通常版`vim`を入れたりしているけど、実は単に`sudo apt install vim`で追加インストールすれば良いだけだった。
そもそもパッケージ自体、通常版は`vim`、簡易版は`vim-tiny`と異なる名称で管理されている。
```shell
$ 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`）で複数の実行ファイル、複数のバージョンを管理する仕組みがあり、既存の`vim`（`vim.tiny`）はそのままで、追加インストールされた`vim`（`vim.basic`）と共存され、追加インストール版の優先順位が上になる。元に戻したければ`update-alternatives`コマンドで再設定できる。

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

```shell:追加インストール後
$ 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`
<BR>
テキストエディタの選択肢。
```shell:追加インストール前
$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.tiny
```
```shell:追加インストール後
$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.basic
/usr/bin/vim.tiny
```
<BR>
リンクはシステムが設定してくれる。というか手動で操作するべきではない。

```shell:追加インストール後
$ 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
```
<BR>

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

```shell: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`コマンドのセッション上でかつ一定以上の文字数の場合、コピーできない模様（`TeraTerm`、`RLogin`共に）。どうもクリップボードコピーは`screen`コマンドと相性が悪い。セッション上ではなくてもやはり上限はあり。

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

参考URL：
[update-alternatives(8) — dpkg — Debian jessie — Debian Manpages](https://manpages.debian.org/jessie/dpkg/update-alternatives.8.ja.html "update-alternatives(8) — dpkg — Debian jessie — Debian Manpages")
[update-alternativesの使い方（vimをeditorグループに登録する） - やってみる](https://ytyaru.hatenablog.com/entry/2020/05/24/000000 "update-alternativesの使い方（vimをeditorグループに登録する） - やってみる")
[How can I add my desired editor to the _update-alternatives_ interactive menu_ - Ask Ubuntu](https://askubuntu.com/questions/891928/how-can-i-add-my-desired-editor-to-the-update-alternatives-interactive-menu "How can I add my desired editor to the _update-alternatives_ interactive menu_ - Ask Ubuntu")