TeraTermProject / teraterm

Other
392 stars 33 forks source link

マクロで読み書きするファイルがUTF-8として扱われる #144

Closed mulder-3bvh closed 3 months ago

mulder-3bvh commented 4 months ago

マクロファイルを使用していますが、 V4(4.108)では問題なく実行できていましたが、 V5(5.1、5.2とも)では、V5初期導入後は実行できますが 2回目以降、動作しません

マクロファイルには、必要な設定情報は別設定ファイルへ出力し参照させています 導入はZIPファイル版です フォルダ毎解凍後、使用しているフォルダ名に変名し使用しています 1回目と2回目のテラタームフォルダの差異は、 ・TERATERM.INI の文字コードがSJISからUTF-16(BOM)  サクラエディタ(2.4.1.2849)では  ZIP版の梱包されているTERATERM.INIはSJIS判定  (たぶんUTF-8とおもわれるが、英数字記号のみな為と思われる) ・YYYYMMDDTHIMMSS+0900_TERATERM.INI のファイルが作成される  TERATERM.INIの中身は修正していない ・KEYBOARD.CNFもTERATERM.INIと同様の動作

なお、TERATERM.INIの文字コードをSJISに保存し直し、 マクロファイルを実行すると動作しますが、 UTF-16(BOM)に変換と YYYYMMDDTHIMMSS+0900_TERATERM.INIが作成され、 2回目は動作しなくなります

使用環境は以下の内容です エディション Windows 11 Pro バージョン 23H2 インストール日 ‎2022/‎10/‎06 OS ビルド 22631.3155 エクスペリエンス Windows Feature Experience Pack 1000.22684.1000.0

nmaya commented 4 months ago

まず「勝手にINIファイルができる」「INIファイルの文字コードが変更される」という動作については、Tera Term が INI ファイルをどう扱うかという仕様についてここを読んでください。

導入はZIPファイル版

ポータブル版ですね、わかりました。

動作しません

「動作しない」とはどのような状態を指しますか? マクロファイルをどのように実行していますか? 「別設定ファイルへ出力し参照させて」は、どのように参照させていますか?設定ファイルを反映する方法はいくつかあります。 問題を再現できる手順(具体的になにをどうしたのか、あなた以外のそれを読んだ人があなたと全く同じ操作を再現できる手順書)や、問題を再現できる最も単純なマクロファイルを提示していただけますか?

mulder-3bvh commented 4 months ago

仕様について

UTF-16 (with LE BOM) に変換される仕様で承知しました ありがとうございます

「別設定ファイルへ出力し参照させて」

動作のざっくりな流れとしましては、以下の感じです ・テラターム本体のteraterm.ini をオープン  fileopen fdef default_ini 0 1 ・カスタム用設定ファイル作成  filecreate ftmp custom_work_ini ・テラターム本体のデータを読み込みながら、変更したい項目を差し替え  filereadln fdef line  filewriteln ftmp line ・ファイルクローズ  fileclose fdef  fileclose ftmp ・カスタム用設定ファイルを/Fに指定して接続

確認した所、カスタム用設定ファイルの形式は、 UTF-16(BOM)でしたが、中身が壊れた内容になっていました image

作成処理を含めもう少し確認してみます

zmatsuo commented 4 months ago

マクロの内の文字コードは全てUTF-8で、filewriteでの書き込みでファイルの文字コードもUTF-8となります。 (Tera Term 4では日本語WindowsではShift JIS固定でした)

読み込んだデータは変換等は行わないのでUTF-16のファイルなら UTF-16のデータになっているのかなと思います。

UTF-8のiniファイルは普通正しく読み込めないので文字化けします。

ファイル読み書き時に文字コードを指定する手段が欲しくなりますね。

mulder-3bvh commented 3 months ago

コメントありがとうございます

使用しているマクロの一部抜粋したマクロファイルをアップします ・テラターム本体のteraterm.ini をオープン ・カスタマイズファイルを新規オープン  (作成先は、マクロファイルと同じフォルダ) ・1行ずつ取得 ・カスタマイズしたい項目と一致した場合、内容差し替え  (ロジック自体はのこしていますが、コメントにしています) ・カスタマイズファイルへ出力 ・全て読み終わった後、クローズ

本体はUTF-16、マクロ内はUTF-8で処理されると 統一できていないので、今回の様な状況になりますね (文字列比較もだめですね) test.txt

nmaya commented 3 months ago

このissueに関するテスト

テストしてみました。

144_test..zip

マニュアル

マクロの内の文字コードは全てUTF-8で、filewriteでの書き込みでファイルの文字コードもUTF-8となります。 内部処理・入出力とも UTF-8 になるということですね。

https://teratermproject.github.io/manual/5/ja/usage/migrate_to_5.html#migrate_macro

文字コード変換

ファイル読み書き時に文字コードを指定する手段

perl の :utf8 とか、PHP の mb_convert_encoding みたいなイメージだと想像しますが、マクロ処理系でサポートするには実装の負荷が大きいと思います。 エンコーディングが山ほどありますし(*1, *2)、変換の組み合わせはこの掛け算になりますし、「波ダッシュ/全角チルダ」「Shift_JIS/CP932」のように特定の言語内でよくある問題もあります。気軽に手を出せるものには思えません。

nmaya commented 3 months ago

マクロで読み書きするファイルがUTF-8として扱われる

「そうだよ(仕様です)」というタイトルになってしまいましたが、現象(と動作に対する異議)を端的に言うとこういうことですよね?

mulder-3bvh commented 3 months ago

コメントありがとうございます やり取りさせて頂いた結果、変更して頂いたタイトル状況による認識で 問題ありません

個人的な意見ですが、マクロファイル内や処理も UTF-16で統一させるというのは? と思ったのですが、負荷が大きいですよね (文字コードもテラターム本体と統一できてシンプルかなと思ったりしたのですが) 読み込みファイルがテラタームのiniファイルだけとは限らないので だめですよね

zmatsuo commented 3 months ago

Tera Term 4 では、ACP(日本語WindowsではCP932,Shift_JIS)が一番自然に扱えて、 fileopenなどのマクロコマンドは読み書きするファイルの文字コードは気にしていなくて、 読み書きするファイルがテキストならShift_JISがいちばん扱いやすいと思います。

fileread(ln)はファイルの中身をそのまま文字列変数に読み込む、 filewrite(ln)は文字列変数の中身をそのままファイルに書き出す、 という動作で内部文字コードについては気にしていないです。

Tera Term 4,5 ともUTF-8(またはACP)のファイルを読んで書くと UTF-8(またはACP)のファイルが書き出せます。

マクロコマンドは文字コードを気にしていないので、 fileread/filewriteを使えばバイナリ的にを扱うこともできて、 文字列変数へ読み込み/から書き出しできます。 でも、文字列変数には'\0'を含むことができないので バイナリの扱いは限定されそうなのと、 UTF-16はアルファベット(例えば'a' は 0x61 0x00の2バイト)などは0x00を含むので そこで文字が途切れてしまうはずです。実用的には使えなさそうです。

文字列変数はこんな動作ですね。

文字列変数に文字列を代入するとき、 文字列の文字コードがそのまま文字列変数に代入される、 いう感じでしょうか。

UnicodeのLatin(U+0041からU+0070)領域は大抵の文字コードで互換性があって、 Shift_JIS と UTF-8 でもこの領域の文字コードはだいたい互換性があります。 添付のテストマクロは Shift_JIS と UTF-8 で書かれていて、 両方とも Tera Term 4 で正しく動作します。 144_2.zip

マニュアル

-リストの1,2は ttl ファイルについての記述である(自動判定する,UTF-8 を推奨)。

ttlファイルについてですね。

-「ただし、内部文字コードが異なるためTera Term 4とは異なる値となります。」とあるので、今までと変わったことは分かるが、マクロ処理系?の内部文字コードがUTF-8という記述はなさそう

文字列変数の文字コードとしてUTF-8が自然に扱える、と説明が必要そうです。

  • fread/fwrite がUTF-8になったという記述もなさそう

ファイルが文字列変数に読み込まれる、 文字列変数がそのまま書き込まれる、 文字コードは気にしていない(変換などもされない)です。 どうマニュアルに書けばいいかな・・。

文字コード変換

filereadln/filewritelnをつかって改行区切りまでファイルを読む/書くときに、 UTF-8へ/から変換して読む/書くとすれば良いかなと思っていました。

たとえばこんな仕様なら比較的簡単に実装できそうかな🤔

zmatsuo commented 3 months ago

UTF-8 以外の文字コードを扱うことを考えるissueを作りました。 #190

文字コードはUTF-8な旨をマニュアルに追記しました。

144 ブランチ(07b7af2)です

問題なさそうでしたら2,3日でmainにマージしようと思います。

zmatsuo commented 3 months ago

マージしました。 続きは #190 で行いましょう。 クローズします。