Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

printkanji_16bit におけるファイル名の扱い #125

Closed
h-kitagawa opened this issue Sep 28, 2021 · 11 comments
Closed

printkanji_16bit におけるファイル名の扱い #125

h-kitagawa opened this issue Sep 28, 2021 · 11 comments

Comments

@h-kitagawa
Copy link
Member

h-kitagawa commented Sep 28, 2021

ややこしくなりそうなので,#81 の以下の h20y6m さんのコメントを新 issue に切り出しておきます.

printkanji_16bit を独自の win32 ビルドで試していいるのですが、日本語ファイル名で少しきになることがあります。
(独自ビルドのせいだったらすみません)

以下の内容のファイルと UTF-8 エンコードで 日本語.tex として保存します。

% 日本語.tex
% UTF-8 encoding
\def\TEST#1{\ifx#1\relax\else\immediate\write16{[\meaning#1]}\expandafter\TEST\fi}
\expandafter\TEST\jobname\relax

\immediate\openout0=\jobname.txt
\immediate\write0{日本語}
\immediate\closeout0

\openin0=\jobname.txt
\ifeof0
  \immediate\write16{File `\jobname.txt' not found.}
\else
  \read0 to \TEXT
  \immediate\write16{TEXT=\TEXT}
\fi
\closein0

\input \jobname.txt

\end
  • 従来の pTeX (TeX Live 2021, win32) の場合:
>ptex -synctex=1 -no-guess-input-enc -kanji=utf8 日本語.tex
This is pTeX, Version 3.141592653-p3.9.0 (utf8.sjis) (TeX Live 2021/W32TeX) (preloaded format=ptex)
 restricted \write18 enabled.
(./日本語.tex
[kanji character 日]
[kanji character 本]
[kanji character 語]
TEXT=日本語
(./日本語.txt) [1] )
Output written on 日本語.dvi (1 page, 260 bytes).
SyncTeX written on 日本語.synctex.gz.
Transcript written on 日本語.log.
  • 従来の upTeX (TeX Live 2021, win32) の場合:
>uptex -synctex=1 -no-guess-input-enc -kanji=utf8 日本語.tex
This is upTeX, Version 3.141592653-p3.9.0-u1.27 (utf8.uptex) (TeX Live 2021/W32TeX) (preloaded format=uptex)
 restricted \write18 enabled.
(./日本語.tex
[kanji character 日]
[kanji character 本]
[kanji character 語]
TEXT=日本語
(./日本語.txt) [1] )
Output written on 日本語.dvi (1 page, 264 bytes).
SyncTeX written on 日本語.synctex.gz.

Transcript written on 日本語.log.
  • 新しい pTeX (printkanji_16bit, win32) の場合:
>ptex-beta -synctex=1 -no-guess-input-enc -kanji=utf8 日本語.tex
ptenc_ptex_mode is called! (1)
This is pTeX, Version 3.141592653-p3.10.90 (utf8.sjis) (TeX Live 2022/dev) (preloaded format=ptex-beta)
 restricted \write18 enabled.
(./日本語.tex
[the character ^^93]
[the character ^^fa]
[the character ^^96]
[the character {]
[the character ^^8c]
[the character ^^ea]
TEXT=日本語
(./日本語.txt) [1] )
Output written on ^^93^^fa^^96{^^8c^^ea.dvi (1 page, 260 bytes).
SyncTeX written on 日本語.synctex.gz.
Transcript written on ^^93^^fa^^96{^^8c^^ea.log.
  • 新しい upTeX (printkanji_16bit, win32) の場合:
>uptex-beta -synctex=1 -no-guess-input-enc -kanji=utf8 日本語.tex
ptenc_ptex_mode is called! (1)
This is upTeX, Version 3.141592653-p3.10.90-u1.27 (utf8.uptex) (TeX Live 2022/dev) (preloaded format=uptex-beta)
 restricted \write18 enabled.
(./譌・譛ャ隱・tex
[the character ^^e6]
[the character ^^97]
[the character ^^a5]
[the character ^^e6]
[the character ^^9c]
[the character ^^ac]
[the character ^^e8]
[the character ^^aa]
[the character ^^9e]
TEXT=日本語
(./譌・譛ャ隱・txt) [1] )
Output written on ^^e6^^97^^a5^^e6^^9c^^ac^^e8^^aa^^9e.dvi (1 page, 264 bytes).

SyncTeX written on 日本語.synctex.gz.
Transcript written on ^^e6^^97^^a5^^e6^^9c^^ac^^e8^^aa^^9e.log.
  • \jobname が欧文バイト列になっている
  • upTeX では読み込んだファイル名が化けている
  • .dvi と .log のファイル名が ^^ 形式になっている

なお全ての場合で正しいファイルが読み書きされており使用上は問題なさそうです。

printkanji_16bit を含めない独自ビルドでは従来と同じになったので printkanji_16bit に起因するものだと思うのですが……

Originally posted by @h20y6m in #81 (comment)

@h-kitagawa
Copy link
Member Author

とりあえず -jobname を明示的に指定した場合については h-kitagawa@f2cf00f でやってみました.今回の例のようにファイル名自体に和文文字がある場合はまだです.

@h-kitagawa
Copy link
Member Author

h-kitagawa commented Oct 1, 2021

00b6c07 で直したつもりですが,どうでしょうか?(手元の TeX 環境は UTF-8 の Linux 環境しかないので……)
→10/2 7:46 edit. tex のコンパイルがうまく行かないようです(texmfmp.c の誤記でした,あとで直します)


UTF-8 の Linux 環境では,従来の pTeX でも

 $ ptex -kanji=utf8 日本語.tex
This is pTeX, Version 3.141592653-p3.9.0 (utf8.euc) (TeX Live 2022/dev) (preloaded format=ptex)
 restricted \write18 enabled.
(./�^^97ユ^^9c�^^9e.tex
[kanji character 日]
[kanji character 本]
[kanji character 語]
TEXT=日本語
(./�^^97ユ^^9c�^^9e.txt) [1] )
Output written on 日本語.dvi (1 page, 260 bytes).
Transcript written on 日本語.log.

と変な表示になっています.
今回の調査で気づいたのですが,「ファイルを読み始めた」際の (hoge,tex などというファイル名出力では,ptexenc の漢字コード変換を通すべきではないようです.

@h20y6m
Copy link
Collaborator

h20y6m commented Oct 2, 2021

00b6c07 を試してみました。

C:\work\tex\ptex-beta>ptex-beta -synctex=1 -no-guess-input-enc -kanji=utf8 日本語.tex
ptenc_ptex_mode is called! (1)
This is pTeX, Version 3.141592653-p3.10.90 (utf8.sjis) (TeX Live 2022/dev) (preloaded format=ptex-beta)
 restricted \write18 enabled.
(./^^93^^fa^^96{^^8c^^ea.tex
[kanji character 日]
[kanji character 本]
[kanji character 語]
TEXT=日本語
(./^^93^^fa^^96{^^8c^^ea.txt) [1] )
Output written on 日本語.dvi (1 page, 260 bytes).
SyncTeX written on 日本語.synctex.gz.
Transcript written on 日本語.log.

C:\work\tex\ptex-beta>uptex-beta -synctex=1 -no-guess-input-enc -kanji=utf8 日本語.tex
ptenc_ptex_mode is called! (1)
This is upTeX, Version 3.141592653-p3.10.90-u1.27 (utf8.uptex) (TeX Live 2022/dev) (preloaded format=uptex-beta)
 restricted \write18 enabled.
(./^^e6^^97・訖^9cャ鐃^aa^^9e.tex
[kanji character 日]
[kanji character 本]
[kanji character 語]
TEXT=日本語
(./^^e6^^97・訖^9cャ鐃^aa^^9e.txt) [1] )
Output written on 日本語.dvi (1 page, 264 bytes).
SyncTeX written on 日本語.synctex.gz.

Transcript written on 日本語.log.

\jobname, .log, .dvi はよくなったようですが、読み込んだファイル名は ptex でも化けるようになりました。

また、.log の \openout0 = が ptex で化けていたようです。


win32 では以下のパッチでよくなりました。

diff --git a/source/texk/ptexenc/ptexenc.c b/source/texk/ptexenc/ptexenc.c
index 695977bdf..1ddedc834 100644
--- a/source/texk/ptexenc/ptexenc.c
+++ b/source/texk/ptexenc/ptexenc.c
@@ -285,13 +285,13 @@ DEFINE_MULTISTRLEN(short,unsigned short);
 int multistrlenfilename(unsigned short *s, int len, int pos)
 {
     s += pos; len -= pos;
-    if (terminal_enc == ENC_UTF8) {
+    if (is_internalUPTEX()) {
         int ret = UTF8Slengthshort(s, len);
         if (ret < 0) return 1;
         return ret;
     }
     if (len < 2) return 1;
-    if (terminal_enc == ENC_SJIS) {
+    if (is_internalSJIS()) {
         if (isSJISkanji1(s[0]) && isSJISkanji2(s[1])) return 2;
     } else { /* EUC */
         if (isEUCkanji1(s[0])  && isEUCkanji2(s[1]))  return 2;
diff --git a/source/texk/web2c/ptexdir/ptex-base.ch b/source/texk/web2c/ptexdir/ptex-base.ch
index 9f88d61d6..ff1441dc0 100644
--- a/source/texk/web2c/ptexdir/ptex-base.ch
+++ b/source/texk/web2c/ptexdir/ptex-base.ch
@@ -385,9 +385,9 @@ else begin i:=str_start[s]; l:=str_start[s+1];
   while i<l do begin
     p:=multistrlenfilename(str_pool, l, i);
     if p<>1 then
-      begin for j:=i to i+p-1 do print_char(so(str_pool[j]));
+      begin for j:=i to i+p-1 do print_char(@"100+(so(str_pool[j]) mod 256));
       i:=i+p; end
-    else begin print(so(str_pool[i])); incr(i); end;
+    else begin print(so(str_pool[i]) mod 256); incr(i); end;
     end;
   end;
 end;
@@ -401,10 +401,10 @@ begin if s<>0 then begin
   while i<l do begin
     p:=multistrlenshort(str_pool, l, i);
     if p<>1 then begin
-      for j:=i to i+p-1 do print_char(@"100+so(str_pool[j]));
+      for j:=i to i+p-1 do print_char(@"100+(so(str_pool[j]) mod 256));
       i:=i+p; end
     else begin
-      if so(str_pool[i])<>"""" then print(so(str_pool[i]));
+      if so(str_pool[i])<>"""" then print(so(str_pool[i]) mod 256);
       incr(i); end;
     end;
   end;

「ファイルを読み始めた」際の (hoge,tex などというファイル名出力では,ptexenc の漢字コード変換を通すべきではないようです.

非 Windows かつ内部コードが upTeX 以外かつ端末が UTF-8 のときはファイルオープン時に内部コード⇔UTF-8 変換しているようなので、この場合はコード変換があったほうがよい気がします。

UTF-8 の Linux 環境では,従来の pTeX でも...

openclose.c の open_inputfullnameoffile を UTF-8 から内部コードに戻していないように見えます。
これをさらに内部コード→UTF-8 変換して化けるのではないでしょうか?

@h20y6m
Copy link
Collaborator

h20y6m commented Oct 2, 2021

UTF-8 の Linux 環境では,従来の pTeX でも...

openclose.c の open_inputfullnameoffile を UTF-8 から内部コードに戻していないように見えます。 これをさらに内部コード→UTF-8 変換して化けるのではないでしょうか?

これで直りそう?

diff --git a/source/texk/web2c/lib/openclose.c b/source/texk/web2c/lib/openclose.c
index 63fa03935..20c3a47de 100644
--- a/source/texk/web2c/lib/openclose.c
+++ b/source/texk/web2c/lib/openclose.c
@@ -281,6 +281,13 @@ open_input (FILE **f_ptr, int filefmt, const_string fopen_mode)
                                     must_exist);
             if (fname) {
                 fullnameoffile = xstrdup(fname);
+#if defined(PTEX) && !defined(WIN32)
+                fname0 = ptenc_from_utf8_string_to_internal_enc(fullnameoffile);
+                if (fname0) {
+                    free (fullnameoffile);
+                    fullnameoffile = fname0;
+                }
+#endif
                 /* If we found the file in the current directory, don't leave
                    the `./' at the beginning of `nameoffile', since it looks
                    dumb when `tex foo' says `(./foo.tex ... )'.  On the other

@h-kitagawa
Copy link
Member Author

h-kitagawa commented Oct 2, 2021

ありがとうございます.とりあえずどちらも適用し,非 Windows で動くようにしました (627b5d6).

  • slow_print_filename (ptex-base.ch) ではわざわざ multistrlenfilename とする意味はなくなったので,multistrlenshort に統一.
  • nameoffile を内部コードに戻すと,SyncTeX の出力ファイル名がそれに応じて化けるので,それっぽい修正を行いました.
    →nameoffile とは関係なさそう.

ただ,

openclose.c の open_input で fullnameoffile を UTF-8 から内部コードに

という処理を加えるよりかは,multistrlenfilename 側を Windows か否かで分ける(Windows なら multistrlenshort そのまま)としたほうが良いかもと思うようになってきました.この方針でも試してみます.

@h-kitagawa
Copy link
Member Author

#45 とも関連?

@aminophen
Copy link
Member

一通りコミットが終わって落ち着いたと思っていたのですが

\input foo€€€.tex %
\bye

これを j1.tex として ptex (euc) で処理すると

This is pTeX, Version 3.141592653-p4.0.0 (utf8.euc) (TeX Live 2022) (preloaded format=ptex 2022.2.16)  2 MAR 2022 21:28
 restricted \write18 enabled.
 %&-line parsing enabled.
**j1
(./j1.tex
! I can't find file `foo^^e2^^82<00>^^82<00>^^82^^ac.tex'.
l.1 ...oo^^e2^^82^^ac^^e2^^82^^ac^^e2^^82^^ac.tex 
                                                  %

I can't find file のところに null 文字が入っていることに気づきました。

@h-kitagawa
Copy link
Member Author

確認しました,後で調べます.

@h-kitagawa
Copy link
Member Author

h-kitagawa commented Mar 2, 2022

ファイル名は和文欧文の区別をしないことから, foo^^e2^^82^^ac^^e2^^82^^ac^^e2^^82^^ac.tex^^ac^^e2 が和文文字と認識.
→JIS X 0208 では未定義の箇所に相当するので出力がヌル文字,ということのようです.
22:41. 誤植修正

@h-kitagawa
Copy link
Member Author

とりあえずこうするとヌル文字にはならず,ac e2 というバイト列が直に出力されます.本当は WEB 経由でやりたい(TCX ファイルで ^^ 記法にするか否か指定可能であるから)

--- a/source/texk/ptexenc/ptexenc.c
+++ b/source/texk/ptexenc/ptexenc.c
@@ -560,7 +560,10 @@ int putc2(int c, FILE *fp)
             num[fd]++;
             if (multistrlen(store[fd], num[fd], 0) == num[fd]) {
                 long i = fromBUFF(store[fd], num[fd], 0);
-                ret = put_multibyte(toENC(i, output_enc), fp);
+                long nc = toENC(i, output_enc);
+                if (nc==0)
+                    for (int j=0;j<=num[fd];j++) ret = putc(store[fd][j], fp);
+                else ret = put_multibyte(toENC(i, output_enc), fp);
                 num[fd] = -1;
             } else if ((is_internalUPTEX() && num[fd] == 4) ||
                 (!is_internalUPTEX() && num[fd] == 2)) { /* error */

@t-tk
Copy link
Collaborator

t-tk commented Dec 22, 2022

upTeX で内部コードが euc/sjis の場合の日本語ファイル名 #136 で確かめたように、本Issueで挙げられた問題は全て解決したと思います。ここは閉じます。

@t-tk t-tk closed this as completed Dec 22, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants