> 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 をタイプセットしても正しい文字になるようです。
以下のファイルで検証してみました。
[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 である。