[ 新規に投稿する ]

tagsファイルの文字コードについてNo.41085
fzok4234 さん 24/03/12 12:17 [ コメントを投稿する ]
  毎度お世話になっております。Fzok4234 です。


さて、「tagsファイルの作成」コマンドで作成される tags ファイルについてですが、
このファイルの文字コードは「UTF-8、BOM 無し、CRLF」でよろしいでしょうか?

この tags ファイルを当方の設定で秀丸エディタで開いたところ、上記のように
認識されたのですが、これをこのまま .editorconfig や .gitattributes の設定に
記述してよいのか迷っています。

もしかして、実は「SHIFT-JIS、CRLF」だったということはあるのでしょうか?

もし仮に本当に SHIFT-JIS だった場合、Unicode 文字を含む場合はどうなるのでしょうか?

[ ]
RE:41085 tagsファイルの文字コードについてNo.41086
秀丸担当 さん 24/03/12 14:41 [ コメントを投稿する ]
  tagsファイルは、昔からShift-JISで、今もShift-JISのはずだと思います。
UTF-8で動いていることがあるとしたら、ちょっとわからないですが、検索対象がASCII文字で動いているように見えるということかもしれません。
飛び先が複数ある場合にダイアログが出ますが、tagsファイルの内容がUTF-8の場合は日本語などが文字化けして見えたりしました。
対応するとしたら、BOMなしだど自動判定が挟まるので、BOMありUTF-8ができたらいいです。
BOMありUTF-8の読み取り対応を検討しようと思います。
[ ]
RE:41086 tagsファイルの文字コードについてNo.41087
fzok4234 さん 24/03/12 17:43 [ コメントを投稿する ]
  対応の検討ありがとうございます。やはり SHIFT-JIS だったのですね。

> 対応するとしたら、BOMなしだど自動判定が挟まるので、BOMありUTF-8ができたらいいです。
> BOMありUTF-8の読み取り対応を検討しようと思います。

BOM 有り UTF-8 は GIT 及び GitHub でうまく管理できないのでやるべきではありません。

例えば、
https://blog.shibayan.jp/entry/20130529/1369816283
にあるような問題を引き起こすためです。このため、わざわざ
https://qiita.com/kitamin/items/0f0a183771684e853fc2

https://zenn.dev/mebiusbox/articles/1fc0ffef39a446
のように苦心して BOM 有り UTF-8 を排除する人もいるくらいです。

.gitattributes ファイルも BOM 無し UTF-8 や BOM 有り無し両方の UTF-16 は
設定可能だが、BOM 有り UTF-8 はどうやっても設定できません。

このことから、tags ファイルの Unicode 化は UTF-16 または  BOM 無し UTF-8 に
限定されることとなります。tags ファイルに限らずもし他に Unicode 未対応の
設定ファイル等があれば同様となります。

実際に対応するときには、動作環境の「タグジャンプ」のページに「タグファイルを
Unicode にする」というチェックボックスを新設して、これが有効なときのみ tags ファイルを
Unicode として読み書きを行い、無効なときには従来通り SHIFT-JIS として扱う、というような
「オプション扱い」とすることで互換性の維持をする必要があろうかと思われます。

[ ]
RE:41087 tagsファイルの文字コードについてNo.41088
fzok4234 さん 24/03/12 18:07 [ コメントを投稿する ]
  あとそれから、今後のアップデートで tags ファイルの Unicode 化が入った場合、ユーザーが
自分で既存の SHIFT-JIS の tags を Unicode の文字コードで上書き保存する必要が生じます。

しかし、普通に秀丸エディタでファイルを上書き保存するとタイムスタンプまで更新されて
しまうため、tags のタイムスタンプが狂って「tagsファイルの自動更新」の機能が上手く
動作しなくなる恐れがあります。このため、上書き保存後にタイムスタンプを元に戻す作業が
必要になるのですが、これが非常に面倒な操作となります。

そこで、要望があるのですが、秀丸エディタ本体に、
 ・タイムスタンプを変更しないで「上書き保存」。
 ・指定した任意のタイムスタンプで「名前を付けて保存」。
などといった機能を新設してもらえれば助かります。

本来の話題からそれるのですが、よろしくお願いします。


[ ]
RE:41088 tagsファイルの文字コードについてNo.41090
秀丸担当 さん 24/03/13 15:46 [ コメントを投稿する ]
  UTF-8をしようと調べてみたら、以前にctags対応の延長で、ctagsのヘッダ部分にUTF-8が宣言されていたらできるようにしていました。
できるといってもShift-JISに変換できる文字を見えるようにするという程度でした。
BOMなしの勢力があるのもわかりますが、とりあえず秀tagsで生成するわけではないので、互換性があるまま読み取りに対応する程度でしてみようと思います。
[ ]
(発言者削除)No.41094
fzok4234 さん 24/03/13 17:01
 
[ ]
RE:41090 tagsファイルの文字コードについてNo.41095
fzok4234 さん 24/03/13 17:17 [ コメントを投稿する ]
  > UTF-8をしようと調べてみたら、以前にctags対応の延長で、ctagsのヘッダ部分にUTF-8が
> 宣言されていたらできるようにしていました。
> できるといってもShift-JISに変換できる文字を見えるようにするという程度でした。
> BOMなしの勢力があるのもわかりますが、とりあえず秀tagsで生成するわけではないので、
> 互換性があるまま読み取りに対応する程度でしてみようと思います。


対応の検討ありがとうございます。


「読み取りに対応する程度でしてみよう」とのことですが、もし「読み取り」だけ Unicode に
対応して「書き込み」では一切対応しないようにしてしまうと、「tagsファイルの自動更新」の
機能で自動的に上書きする際に問題が起きてしまいます。

よって、「読み取り」と「書き込み」への対応は同時に行う必要があります。


それから、対応する Unicode の文字コードの選定についてですが、今までの他の設定ファイル類の
Unicode 対応において、*.hmdesk や *.hmbook が BOM 有り UTF-16LE で生成されるように
なったことや、*.hilight や単語補完の辞書ファイルもユーザーが BOM 有り UTF-16LE で
作成したものの読み取りに対応できるようになったことを考慮すると、tags ファイルについても
まずは BOM 有り UTF-16LE に対応させることを優先的に行った方がよいのでは、と思います。

秀丸エディタが扱う各種設定ファイルが、「あのファイルは UTF-8 でこのファイルは UTF-16 で」と
いうように種類ごとに Unicode のエンコードが異なってしまうと、運用する側での混乱の元と
なってしまうため、できれば「UTF-16LE、BOM 有り、CRLF」だけは確実に読み書きできるように
してもらえれば、ユーザー側で全ての設定ファイル類を「UTF-16LE、BOM 有り、CRLF」に統一して
運用できるようになって混乱を防ぐことができるようになります。

その上で、後から UTF-8 等への対応を行っていただければよいと思います。


tags ファイルのエンコードが現状では SHIFT-JIS のみであることが発覚したため、当方において
tags ファイルの扱いを、.editorconfig 上では

[tags]
charset     = latin1
end_of_line = crlf

として、これに合わせる形で .gitattributes も

tags text eol=crlf working-tree-encoding=ASCII

として否応なく ASCII オンリーの状態にしなければならなくなりました。このため、tags ファイルに
全角文字などを混ぜることができない状態となり、取り扱う編集対象のソースファイルもクラスや
関数の名前を定義した行と同じ行に

public class Foo { // コメント。

といった日本語のコメントを書けないなど、不便な状態を強いられるようになってしまいました。

tags ファイルの読み取りはもちろんのこと、 秀tags での作成、および自動更新に伴う書き込みでの
Unicode 対応について、改めてよろしくお願い申しあげます。


[ ]
RE:41095 tagsファイルの文字コードについてNo.41105
秀丸担当 さん 24/03/14 15:32 [ コメントを投稿する ]
  秀tagsでも読み書きも、何でもできたらいいです。
tagsファイルで意味があるのは、ダイレクトタグジャンプ飛び先指定のダイアログ中の表示くらいだと思います。
秀tagsはソースの読み取りはUTF-8でも見て、書き込みがShift-JISです。
ctagsなどの外部による生成を使わず、秀tagsのみが書き込み、秀丸エディタが読み込むのであれば、Shift-JISに変換できる日本語のコメントは見えます。
既に実用上は何も考えずにできるので、もしUTF-8で設定が必要になってくるとしたらデメリットのほうが大きいと思います。
もしやるとしたら、読み取りは自動判定かなと思います。
[ ]
RE:41088 tagsファイルの文字コードについてNo.41109
igus さん 24/03/15 12:25 [ コメントを投稿する ]
  ファイルの更新日時を変更したり削除したりするファイル操作は
秀丸マクロだけでやろうとすると難しいのですが
rubyなどのスクリプト言語と組み合わせると
あんがい簡単に出来たりします
参考になるかどうか分かりませんが試しに作ってみました

http://pansy.s1010.xrea.com/2024/03/15/%e6%9b%b4%e6%96%b0%e6%97%a5%e6%99%82%e3%82%92%e6%93%8d%e4%bd%9c/
[ ]
RE:41109 tagsファイルの文字コードについてNo.41112
fzok4234 さん 24/03/17 04:54 [ コメントを投稿する ]
  マクロの提案ありがとうございます。

あいにく Ruby は常用する言語ではないのでコードを理解するのに少々手間がかかりそうですが、
参考にさせて頂きます。もし実装するとなれば、Windows に元から入っている .Net Framework 4.8 を
利用する C# の COM 対応 DLL かまたは Windows PowerShell のスクリプトの形にしようと
思います。


[ ]
RE:41105 tagsファイルの文字コードについてNo.41113
fzok4234 さん 24/03/17 12:46 [ コメントを投稿する ]
  > 秀tagsはソースの読み取りはUTF-8でも見て、書き込みがShift-JISです。

9.32β4 にアップデートした上で、BOM 有り UTF-8 の tags ファイルがちゃんと「読める」ことを
確認いたしました。

ただ、「tagsファイルの自動更新」機能を有効にしている場合、tags ファイルよりもジャンプ先の
ファイルが新しいときにダイレクトタグジャンプを行うと、自動更新に伴う「書き込み」により
SHIFT-JIS に戻されてしまいました。

やはり自動更新に伴う書き込みは、読み込んだときと同一のエンコードで行うべきでしょう。


> tagsファイルで意味があるのは、ダイレクトタグジャンプ飛び先指定のダイアログ中の
> 表示くらいだと思います。
> ctagsなどの外部による生成を使わず、秀tagsのみが書き込み、秀丸エディタが読み込むのであれば、
> Shift-JISに変換できる日本語のコメントは見えます。
> 既に実用上は何も考えずにできるので、もしUTF-8で設定が必要になってくるとしたらデメリットの
> ほうが大きいと思います。

確かに、対象ファイルの各行の「コメント」のみが Unicode 文字の場合は、たとえそれが SHIFT-JIS への
変換で文字化けしてもダイレクトタグジャンプ自体は機能するでしょう。

しかし、対象ファイルのプログラム本文中の「クラスや関数の名前」が Unicode 文字の場合は、これが
文字化けしてしまうとそこへダイレクトタグジャンプできなくなってしまいます。C# など主に
2000 年代以降にできた言語では識別子名に Unicode 文字が使えるため、これでは困ります。

さらに、もっと発生確率が高いのは対象ファイル自体の「ファイルパス」が Unicode 文字の場合
です。tags ファイルのフォーマットは
パス文字列(行番号) : 行文字列
となっているため、パス文字列の部分が文字化けしてしまうとその対象ファイルへ
ダイレクトタグジャンプできなくなります。特に Windows のローカルアカウント名が Unicode 文字なら
対象ファイルがユーザーディレクトリ内であれば、そのフルパスは確実に文字化けします。


[ ]
RE:41113 tagsファイルの文字コードについてNo.41114
fzok4234 さん 24/03/17 16:49 [ コメントを投稿する ]
  先ほど、

> しかし、対象ファイルのプログラム本文中の「クラスや関数の名前」が Unicode 文字の場合は、これが
> 文字化けしてしまうとそこへダイレクトタグジャンプできなくなってしまいます。C# など主に
> 2000 年代以降にできた言語では識別子名に Unicode 文字が使えるため、これでは困ります。

と申し上げましたが、実際にコメントではないクラス名の部分に Unicode 文字を使ってテストしたところ、
その 1 行はスキップされて tags ファイルには取り込まれなかったようです。

実際、C# のファイル UnicodeName.cs を以下の内容にして tags ファイルを作成しました。

0001  using   System  ;
0002  
0003  public  class   쇂𧀊 {}
0004  
0005  public  class   B00 {}  // 쇂𧀊
0006  

当方の環境で、1 行目は「行の強調4」、3 行目と 5 行目は「行の強調3」、5 行目の末尾の // 以降は
「コメント」で色付けされています。出力された tags ファイルは、

UnicodeName.cs(1) : using   System  ;
UnicodeName.cs(5) : public  class   B00 {}  // ???

となっていて、「コメント」で色付けされていないクラス名の部分に Unicode 文字が使われている
3 行目が抜け落ちている状態です。また、5 行目の「コメント」で色付けされた Unicode 文字は全て
「?」に文字化けさせる置換フォールバック処理が行われています。


また、憶測で

> さらに、もっと発生確率が高いのは対象ファイル自体の「ファイルパス」が Unicode 文字の場合
> です。tags ファイルのフォーマットは
> パス文字列(行番号) : 行文字列
> となっているため、パス文字列の部分が文字化けしてしまうとその対象ファイルへ
> ダイレクトタグジャンプできなくなります。

と申しましたが、実際にはファイル名に Unicode 文字を含んでいるファイルはエラーが出て
スキップされるようです。

実際、©쇂𧀊👩🏼‍👨🏽‍👦🏼‍👧🏽‍.cs という名前の C# のファイルに対して tags ファイルを出力しようとしたら

---------------------------
エラー
---------------------------
ファイル名にユニコード文字が入っています。このファイルはスキップします。
ファイル = ©쇂𧀊👩🏼‍👨🏽‍👦🏼‍👧🏽‍.cs
---------------------------
OK   
---------------------------

というエラーが表示されて、tags ファイルにはこのファイルの情報は何も出力されませんでした。

ただ、これはこれで「ファイル名をフルパスで出力」を有効にして出力するとき、親ディレクトリ名、
特に
C:\Users\<UserName>\
の <UserName> の部分に Unicode 文字のアカウント名があると tags ファイルの作成に大きな
支障を来すと思います。


[ ]
RE:41114 tagsファイルの文字コードについてNo.41125
秀丸担当 さん 24/03/19 15:43 [ コメントを投稿する ]
  いろいろご指摘ありがとうございます。
ファイル名にUnicode文字が使われている場合は、確かにできないです。
これはShift-JISである限りは無理なので、UTF-8でできたほうがいいです。

クラス名をUnicodeとする場合は、うまく再現できませんでした。
現実問題としてそういう使われ方をするのだろうかとも思いましたが、config文のヘルプのJSONの説明で自分が日本語タイプ名を書いていたくらいので、普通にありえる気もしてきました。
いずれもできたほうがいいと思います。
また検討していきます。
[ ]

[ 新規に投稿する ]