texjporg / tex-jp-build

Minimum source repository to build Japanese TeX processing tools
23 stars 6 forks source link

e-(u)pTeX: ^ + 欧文バイトを \detokenize すると文字列が壊れる #146

Closed h20y6m closed 2 years ago

h20y6m commented 2 years ago

^ + 欧文バイトを \detokenize すると文字列が壊れます。

% e-pTeX
% UTF-8で保存。
\def\test#1{\expandafter\testi\detokenize{#1}\relax}
\def\testi#1{\ifx#1\relax\else\immediate\write16{[#1]}\expandafter\testi\fi}
\test{^☃}

を実行すると

[^^^]
[e]
[2]
[^^98]
[^^83]

おそらく \detokenize の内部で ^^^e2^^98^^83 を生成しそれを再解釈することによって発生するのではないかと思います。

h-kitagawa commented 2 years ago

pTeX の UTF-8 入力では,JIS X 0208 の範囲外の Unicode 文字は ^^xx 記法に(ptexenc で)変換されてから,pTeX 本体が処理することになります.

つまり,今回の例でいうと,

\test{^☃}

と入力しても,pTeX は

\test{^^^e2^^98^^83}

が入力されたと解釈する(両者は区別できない),ということです.

h20y6m commented 2 years ago

勘違いだったようですみません。

% UTF-8で保存。
\catcode32=9
\def\test#1{\expandafter\testi\detokenize{#1}\relax}
\def\testi#1{\ifx#1\relax\else\immediate\write16{[#1]}\expandafter\testi\fi}
\test{^ ☃}

とすると

[^]
[^^e2]
[^^98]
[^^83]

と正しく処理されました。