ptexenc での 0208 外の UTF-8 入力の扱い

ptexenc での 0208 外の UTF-8 入力の扱い

- Z. R. の投稿
返信数: 4

従来の pTeX の UTF-8 入力の仕様では、

〈①〉や〈鄧〉等の JIS X 0208 にない Unicode 文字は元の UTF-8 のバイト列をエスケープ(^^ab 形式)したものに変換される

ということでした。ところが、少なくとも最新の W32TeX においては、JiS X 0213 や JIS X 0212 にある文字については、そこでの符号位置(に対応する sjis 値)をもつ和文トークンだと扱われるようです。(他のビルドは試していない。)

※参照:「ユニコード入力の漢字のプリントアウトについて」

% ptex -kanji=utf8 -kanji-internal=sjis -no-guess-input-enc
\def\inspect#1#2\nil{\count255=`#1}
\inspect 鄧\nil
\showthe\count255 % => 57797
% 従来の仕様なら「233」(先頭バイトの値)になるはず
\bye

上のようなコードで試してみたところ:

  • 〈①〉は JIS X 0213 の位置「13-01」の sjis 値 0x8740(CP932 の値でもある)の和文トークン
  • 〈鄧〉は JIS X 0212 の位置「66-39」に対する sjis 値 0xE1C5 の和文トークン(ちなみに、JIS X 0213 の符号位置は「92-80」(0xEEEE)、CP932 では 0xFBB9)

今の動作だと、0212 と 0208 の同じ位置の文字が区別されないので、仕様としてはまずいと思いますが、これは意図した変更なのでしょうか?

ptexlive の変更履歴には

Unicode テーブルを gd ではなく nkf のものを利用するようにした。

とあり、恐らく動作の変化はこれに起因するのだと推測しますが…。

Z. R. への返信

Re: ptexenc での 0208 外の UTF-8 入力の扱い

- 水羽 信男 の投稿
Z.R.さま

ご指摘のように、以前のplatex-utf8では問題なく処理できていました。最新のW32Texにバージョンアップして以後の変化です。以下のようなメッセージが出るようになったのが、今回ご指摘の点に関わっているのでしょうか。

Output written on test.dvi (1 page, 316 bytes).
Transcript written on test.log.
(nkf = UTF-8 = utf8)(nkf = ISO-2022-JP = jis)(nkf = ISO-2022-JP = jis)(nkf = EUC-JP = euc)


水羽 信男 への返信

Re: ptexenc での 0208 外の UTF-8 入力の扱い

- Z. R. の投稿

2011/4 に pTeX に「内部組込の nkf を用いて入力ファイルの文字コードを自動判別する」という機能が追加されました。大体次のような仕様です。

  • p(la)tex コマンド起動時に -guess-input-enc オプションを付けると自動判別が有効になる。
  • -no-guess-input-enc オプションを付けると自動判別が無効になる。
  • どちらのオプションもない場合(既定値)は自動判別は有効である。(ただし texmf.cnf の設定で既定値は変えられる。)
  • 自動判別が有効の時には、判定結果が画面に出力される。
    ただこれだけ stderr に出るのはあまり適切でない気がするが…。
  • 自動判別が有効の時には、文字コード指定のオプション -kanji が無視される
    platex-utf8 コマンドは platex -kanji=utf8 と同等なので、結局単なる platex と同じ動作になる(つまり文字コードは自動判別になる)。
  • メインの TeX 文書(この場合 test.tex)に対する判定結果(「(nkf = UTF-8 = utf8)」)が最初に出ているが、これが想定通りのもの(UTF-8)であれば「自動判別による影響」はないと考えられる。
  • (補足) 自動判別しない場合でも jis のファイルは必ず正常に読めます。従って、jsarticle.cls とか otf.sty とかの「既存の」ファイルの文字コードは、文字コード指定に関わらず読めるように jis になっています(だから、それを読んだときに「jis」と出るのは正常です)。
  • (蛇足) 最後に出ている「euc」は PXbase に含まれる pxbsjc.def を判別したときのものです。この結果は気にしないでください。

結局のところ、今回の失敗の原因になっている動作変更は、自動判別機能の追加と一緒に入ったものであるが、その機能の目的とは無関係であるということです。

Z. R. への返信

Re: ptexenc での 0208 外の UTF-8 入力の扱い

- 水羽 信男 の投稿
仕様の確認と解説、ありがとうございます。ただ細かい点で良く分からない所もありますが、現行版のplatexを使う限り、utf8の直接入力によって正しい印字の結果を得ることは今回の仕様変更後不可能となった、という理解でよろしいでしょうか。
またお世話になると思いますが、よろしくお願いします。
水羽 信男 への返信

Re: ptexenc での 0208 外の UTF-8 入力の扱い

- Akira Kakuto の投稿
ptexlive-20110322 から ptexlive-20110321
に一日ぶん戻ると、従来仕様になりますから、時間ができたときに
そのようにします。標準出力への出力は、デバッグ用の出力という
ことでしたから、出力しないようにします。

W32TeX では使用していませんが、iconv を使用の場合は
どうだったのでしょうか?