texjporg/tex-jp-build

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

Closed this issue · 2 comments

^ + 欧文バイトを \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 を生成しそれを再解釈することによって発生するのではないかと思います。

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

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

\test{^☃}

と入力しても,pTeX は

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

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

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

% 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]

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