Q&A56692への回答

Q&A56692への回答

- Akira Kakuto の投稿
返信数: 4
> C:\Users\Desktop> platex -kanji=utf8 ./test %%<--コンパイル
>
> This is e-pTeX, Version 3.1415926-p3.2-110825-2.3 (utf8.sjis) ...
> ====中略=====
> 作者名は?

この 作者名は? が化けていないのでわかるように,ソースが UTF-8, EUC でも
W32TeXではコンソールには CP932 で出るようになっています。

>
> \NAME=夏目漱石 %%<--入力
> 運^c4目漱吹@ %%<--出力(文字化け)

直接入力の場合は,自動判断しないので,指定の UTF-8 でないと化けるの
だと思います。つまり入力が UTF-8 にできないのが原因だと思います。(違うかもしれませんが)。

> [1] (./test.aux) )
> Output written on test.dvi (1 page, 312 bytes).
>
> ===========================
> Q1:文字化け防止対策のようなものがあるのでしょうか?

chcp 65001 とすると,化けなかった 作者名は? が化けます。
CP932 で出るようにしているからです。
偶然次の Q2 がうまく行くようになっています。

> Q2:上記サンプルコードを platex -kanji=sjis ./test でコンパイルすると
> 正しく表示されますが....それどよろしいのでしょうか?

-kanji=sjis としても,-no-guess-input-enc としない限り,自動判断は
off にならないので,UTF-8 のソースがコンパイルできます。
直接入力部分は指定した sjis なので,コンソールに正しく出力されます。
また面白いことに,\NAME をタイプセットしても正しい文字になるようです。

Akira Kakuto への返信

Re: Q&A56692への回答

- Akira Kakuto の投稿
なお,ある時期以降の W32TeX では ttk さんの方法
によって, --sjis-terminal のあるなしに関わらず
EUC, UTF-8 を tty (つまりコンソール) に出力するときは
CP932 になるようにしています。標準出力でもファイルの
場合には -kanji オプションで指定したコードになります。
つまり,--sjis-terminal オプションは意味のないものに
なっていますが残しています。
JIS コードの場合は,面倒なので tty の場合も特別なこと
をしていませんので,化ける場合があります。

Akira Kakuto への返信

Re: Q&A56692への回答

- Z. R. の投稿

以下のファイルで検証してみました。

[inputtest.tex]
% このファイルの文字コードはUTF-8です
\def\stringA{漢字}
 % 端末に出力
\immediate\write16{表示のテスト}
 % 端末から入力(\stringB に格納)
\read16to\stringB
 % ファイル output.txt を開く
\newwrite\outA
\immediate\openout\outA=output.txt
 % \stringA/\stringB の中身を端末に出力
\immediate\write16{結果=\stringA/\stringB}
 % \stringA/\stringB の中身をファイルに出力
\immediate\write\outA{結果=\stringA/\stringB}
\immediate\closeout\outA
 % 内部表現の検証
\immediate\write16{(\number\expandafter`\stringB)}
\bye
%% EOF

これを「-guess-input-enc -kanji=euc」でコンパイルします。(「-sjis-terminal」は指定無し。また -kanji-internal は既定の sjis のままで。)途中、「\stringB=」のプロンプトが出たところ(\read の実行)で、「瑕」(sjis 符号値が 0xE0EA)を入力しています。

C>ptex -guess-input-enc -kanji=euc inputtest.tex
This is pTeX, Version 3.1415926-p3.2 (euc.sjis) (TeX Live 2012/dev/W32TeX)
 restricted \write18 enabled.
(./inputtest.tex
表示のテスト

\stringB=瑕
結果=漢字/琲
(57576)
 )
No pages of output.
Transcript written on inputtest.log.

出力ファイル output.txt の漢字コードは euc で、内容は以下の通りです。端末出力と同じ結果になっています。そして、この中の〈琲〉は euc での符号値が 0xE0EA となる文字です。

結果=漢字/琲

以上の結果から、以下のようになっていることが推定されます。

  • ファイルからの入力: 自動判別(-guess-input-enc だから)→ utf8
  • ファイルへの出力: -input 指定のもの → euc
  • 端末からの入力: -input 指定のもの → euc
  • 端末からの出力: sjis(正確には CP932)
    ※ 先の角藤さんの回答によると、入力漢字コードが euc であるため、-sjis-terminal の指定の有無に関わらず、CP932 での出力が行われる。

ここで「端末からの入力が euc」というのは、こちらが〈瑕〉のつもりで sjis(CP932)で〈E0 EA〉というバイト列を渡したら、pTeX はそれを euc で〈琲〉と解釈したということです。つまり、\stringB は以下のように定義したのと同値になっています。

\def\stringB{琲}

(補足)最後の「内部表現の検証」は \stringB の中身を「入出力の漢字コードに影響されない方法」で調べるためのもの。表示されている数値は〈琲〉の「内部漢字コード」(これは明らかに sjis)での符号値、つまり 0xE0E8 である。

Z. R. への返信

Re: Q&A56692への回答

- Akira Kakuto の投稿
詳しい実験をありがとうございます。
--sjis-terminal オプションについて訂正します。
これは完全に無意味ではなくて,
--kanji=jis の場合は, --sjis-terminal を指定すると
端末出力が CP932 になって,化けなくなると思います。
--kanji=euc と --kanji=utf8 の場合はどちらでも
化けないと思います。

Akira Kakuto への返信

Re: Q&A56692への回答

- 浮亭 夢介 の投稿

角藤さん,ZRさん たくさんの情報提供ありがとうございます.

もう少し,自分なりに精査してみます.本当にありがとうございました.