これはなに

WSL2内のtmuxからWindowsへのコピペが文字化けしていたのを解決したときに取った方法のメモ。
結論 | 解決方法

急に文字化けするようになった原因は不明だった。しかし、下記の設定で解決した。
# ~/.tmux.conf
set -g set-clipboard off
set -g copy-command 'iconv -f UTF-8 -t UTF-16LE | clip.exe'起きていた問題

WSL2内のtmuxからWindowsへのコピペが文字化けしていた。
たとえば、tmux内でecho "テスト"を実行して、マウスで選択してコピーしたのち、Windowsのメモ帳に貼り付けると、下記のように文字化けしていた。
$ echo "ãã¹ã"
ãã¹ã本来はこうあってほしかった。
$ echo "テスト"
テストなお、これはコマンド実行時にtumx上で文字化けしていたわけではなく、あくまで文字列をコピーしてWindowsで貼り付けたときに発生していた。そのためtmuxで作業が完結する場合は無害だった。
この現象自体は、WSL2内でtmuxを使った場合のみ起きていた。そのため、tmuxを使わずにWSL2のターミナルでマウス選択と右クリックでコピーすると、Windowsに貼り付けても文字化けは起きない。よって、WSL2が悪いとは思えなかった。
また、WSL2内でtmuxを使っていても、Ctrl+vで貼り付ける場合のみ文字化けし、tmuxの貼り付けコマンド(e.g. ctrl+w)でtmux内に貼り付ける場合は文字化けしなかった。ただし、VS Codeのターミナルで起動したtmux内では、貼り付けるときにCtrl+Shift+vを使うと文字化けしていた。
一方で、マウスではなくtmuxのコピーコマンドを使った場合でも、Windowsのメモ帳に貼り付けると文字化けしていた。
原因ではなかったもの

tmuxのコピー設定でclip.exeにパイプする設定をしていると文字化けすることがあるらしい。Windows側がCP932/Shift-JISで解釈してしまうことにより起こるものである。
しかし、今回の環境ではそのような設定はしていなかった。というかそもそもコピーの設定はset -g set-clipboard onのみだった。
ちなみに、当時のtmuxの設定は下記のようになっていた。
$ tmux show-options -g copy-command
copy-command ''
$ tmux show-options -g set-clipboard
set-clipboard on原因だったもの

copy-commandが空で、かつset-clipboard onのとき、tmuxはマウス選択でコピーした内容をWindowsのクリップボードに渡す。このときに、受け取った端末(e.g. Windows Terminal)が文字列をUTF-8ではなくLatin-1で解釈していた。これが文字化けの原因だった。
つまりtmuxは悪くなく、そのあと受け取ったデータをWindowsのクリップボードに書き込む段で文字化けが起きていた。
なお、この原因は不明。急にこうなったので何らかのアップデートが関係していそうだと思っている。今回はこの原因追及まではしていない。
とにかく、Windowsのクリップボードへ書き込まれるときに問題が起きていた。そのため、tmuxのcopy-commandで、Windowsのクリップボードへ書き込む前に文字コードをUTF-16LEに変換することで解決した。
# ~/.tmux.conf
set -g set-clipboard off
set -g copy-command 'iconv -f UTF-8 -t UTF-16LE | clip.exe'おまけ

出来心でChatGPTにこの記事を画像にしてもらった。なかなかよく要約できている。すごい!


