-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
\ucs and \toucs #121
\ucs and \toucs #121
Conversation
ありがとうございます。\show\toucs が \ucs になっていそう? ちょっといま出先なので,この Pull Request の背景については帰ってきたら書きます。 → #122 |
plcore, ifptex, minijs, okumacro, jlreq 辺りでしょうか。
|
|
pTeX (EUC/SJIS) の場合、
でよいように思います。 |
一応突っ込んでおきますが、ASCIIの範囲は (0--127) ですよね。 |
0x80--0xFF の和文文字についてあまり考えていませんでした,すみません.
f5f90b9 で引数が 255 以下の特別扱いをほとんど行わないようにしました.
|
fromUCS(0) の返り値は JIS 222F が適切でしょうか? ptexenc/kanjicnv.c を眺めていたら、JIStoSJIS() で計算不能な場合は 0x813f を返すようにしてありました。
同様に今回も JIS 0x222F は、JIS X 0213 では文字が定義されているのと、単純に数値としてJISの有効範囲と判定するソフトの場合に思わぬ動作をする懸念があるかと思います。杞憂かもしれませんが。 |
私としては「和文の内部コードの範囲ではない」ことが明確にわかるという意味で(JIStoSJIS() についても)0 を推しますが,JIS 0x2120 に統一するというのもありだと思います. 現行で 0x222F になるのは,unicode-jp.c の UCS2toJISnative() に 0 を渡したときに,UnicodeTbl 中の最初の 0 のエントリを拾ってしまうことによるようです: tex-jp-build/source/texk/ptexenc/unicode-jp.c Lines 115 to 122 in 518774f
for ループの前に if (ucs2==0) return 0; /* or 0x2120 */ を入れれば良いと思います. |
master に入った b443b80
これは「fromUCS(0) の返り値を JIStoSJIS() などに合わせて JIS 0x2120 つまり1区0点に統一する」ということでよいでしょうか。問題なければ後ほど svn にコミットしておきます。 |
b443b80 は fromUCS(0) の値を 0 にするものです.UCS2toJISnative(0)=0 → UCS2toJIS(0)=0 → fromUCS(0)=0 となります. tex-jp-build/source/texk/ptexenc/ptexenc.c Lines 381 to 387 in b443b80
tex-jp-build/source/texk/ptexenc/unicode-jp.c Lines 265 to 266 in b443b80
なお,\kuten で範囲外の値 ("089F) を与えると,内部コード euc では -1,sjis では 0x813F が返ってきます.せっかくだからこの辺も統一したいところです. |
了解しました。
(範囲外の値が未定義動作なのは承知の上で,それでも)『この値が返ってきたら範囲外だったことが一目で判別できる』という状態のほうが,expl3 のようなプログラミング言語を実装する側にとって望ましい状態であると思います。せっかくなので統一するという方向に賛成します。 ところで kanji.c の |
動作確認しました。副次的効果として「
「Bad character code のエラーを出すことなく,和文文字の内部コードとして有効かどうか判定する」という \if〜 文(これは |
拝見しました。一部だけですがコメントしておきます。 \typeout{\kuten"015F} %" 本来は不正のはずだが, これは以下の行の tex-jp-build/source/texk/ptexenc/kanjicnv.c Lines 94 to 101 in b443b80
内部コード EUC の時 \typeout{\sjis"817F}%" 本来は不正のはずだが.
内部コード SJIS の時 \typeout{\euc"2422}%" 本来は不正のはずだが,
\typeout{\euc"A2A0}%" 本来は不正のはずだが,
\typeout{\euc"A29F}%" 本来は不正のはずだが,
不正なコードが内部コードとして正常な範囲に化けてしまうので,計算がまずいのでしょうね…。 [edit] コメント欄にパッチ案を載せてみました。 |
今更なんですけど……
(u)pTeXの一部のプリミティブの「文字コード」の引数は和文と欧文を兼ねます。もし従来の動作を変更するのであれば、 |
例のコミット b443b80 は UCS2toJISnative(0)=0x222F だったものを 0 にする物,とあります。従来返っていた JIS 0x222F という値は JIS X 0208 には含まれませんが JIS X 0213 では文字が定義されています。
ということから,従来も ! Bad character code. にはなりませんでした。(先日触れた「is_char_kanji でエラーが出ないが,JIS X 0208 外のためサポートされない文字コード」に該当) …回答になっているでしょうか? |
不十分なところを見つけたので コメント に書きました。 |
その点は了解です。 ただ、改めて考え直してみると、自分が懸念しているのは |
何を返すのが妥当か,ですね。無効な (unsupported) 文字コードを与えた場合の挙動は,現状で
と指摘があるとおりバラバラです。 何を返すのが妥当か,上の方で出てきた値を一覧にしてみます。
何が無難でしょうか。 |
個人的には,不正コード入力は全て -1 にするのがわかりやすいと思っています。先日のパッチ案もその方向性です(UCS2toJIS には未着手,また「不十分なところ」もあり,また3バイト以上の文字コードも未考慮ですが)。ただ,今までエラー出なかったものがエラーになる危惧はあります。 → [edit] パッチ案を https://github.com/texjporg/tex-jp-build/tree/kitagawa_toucs-1 へ(返り値を -1 にするという意味でブランチ名に -1 を付けた)。3バイト以上の文字コードは未考慮。 |
少なくとも「和文文字コードとして不正な値」を意図しているなら「−1」がよさそうですね。 |
pTeX で UTF-8 のファイルを入力したときに内部コード (sjis/euc) に変換できない文字が 以下のところを tex-jp-build/source/texk/ptexenc/ptexenc.c Lines 676 to 677 in d439ece
他にも同様の問題が無いか調べる必要がありそうです。 ところで upTeX に sjis/euc のファイルを入力したときに変換できない文字(例えば SJIS 0x8740 等)はどうするのがいいのでしょうか? |
ご指摘ありがとうございます。全然テストしていなかったので気づきませんでした。さらに悪いことに,試しに https://github.com/texjporg/texjporg-testing のテストケース(cur-plain, cur-latex に置いてある標準ログ .tlg は,現時点の TeX Live svn r59701 で生成したものです)を走らせてみると,内部コード sjis の時に cur-plain/filename.lvt のテストが Segmentation fault: 11 しました。かなり良く検査しないと危ないですね…。 以下,関係ありそうなところ: tex-jp-build/source/texk/ptexenc/ptexenc.c Lines 616 to 617 in d439ece
fromUCS() が -1 を返すと? tex-jp-build/source/texk/ptexenc/ptexenc.c Lines 807 to 808 in d439ece
fromJIS() が -1 を返すと? |
ptexenc のローレベルな関数で -1 を返すと,あちこちに影響が出て追跡がしんどい…。
tex-jp-build/source/texk/dviout-util/dvispc.c Lines 1914 to 1924 in 7068ae9
今回やりたいのは「expl3 のプログラミングレベルで,不正な文字コードをそれと分かりやすくする」ことが目的なので,(e-)(u)pTeX のプリミティブの返り値を調整する程度に止めようと思います。
これでいこうと思います。 |
https://github.com/texjporg/tex-jp-build/tree/kitagawa_toucs-invalid (5ead93a) でこの方針としました。
については「現状維持」になります。
追記:upTeX では \ucs"0 を -1 でなく 0 にすべき → 3d8183b で修正 |
3d8183b の実装を upTeX で以下のソースに通してみると \message{\jis"6 }% => -1
\chardef\X=\jis"6 \relax % => ! Bad character code (-1).
\kansujichar1=\jis"6 \relax % => ! Invalid KANSUJI char ("6).
\bye のように Invalid KANSUJI char のエラーで出る文字コード値が非直感的なので,もう少し考えます。 (補足)特に「upTeX で」と書いたのは,upTeX では 0--127 も和文文字コードとして正当だから不自然に見える,という意味。(upTeX では 0--127 の和文文字トークンが存在しないので,生成するのは欧文トークンである: #36 参照) (追記)いや特に |
これは今回の issue とは関係なく パッチを当てる前でも \inhibitxspcode-1=3
\prebreakpenalty-1=120
\kansujichar1=-1 などで
となりました。tex.web にも
とあるので,負の値かもしれないところに → 81ad436 で修正。 |
plcore→ ptex-manual も追随完了。 ifptex[TODO] マージした時点でZRさんに対応をお願いします。(pTeX を upTeX だと誤判定するのみならず,返り値を -1 に変更した影響で upTeX でも minijs, okumacrotexjporg/jsclasses@384aa1a で対処。 jlreq[TODO] マージした時点でabenoriさんに対応をお願いします。 → abenori/jlreq#86 |
https://github.com/texjporg/tex-jp-build/tree/kitagawa_toucs-invalid (95835d3) での仕様をまとめます。 追加プリミティブについて
不正な文字コード(変換できない場合など)の処理
実装
…こんな感じに整備したつもりですが「ブランチの実装が仕様どおりになっていない」或いは「仕様がまずい」等あればご指摘いただけるとありがたいです。 |
追記:私がまだ迷っているのは
→ チェックを入れるべきか?
→ これも -1 を返すべきか? → |
恒等変換というのは「わかりやすい動作」なので、現状維持の方が安全な気がしますね。
「ここだけ0」なのは違和感があるので、-1で正解だと思います。 |
ありがとうございます。ぼちぼち printkanji_16bit の方 (#81) のテストに注力したいと思いますので,この時点でマージしておき,何かあった時に再考しようと思います。 |
pTeX マニュアル (texjporg/ptex-manual@1fbfe35) |
不正な文字コードをはじく、という仕様にするためには何が不正かを決める必要があり、
などどこかで線を引く必要が生じますね。 |
もしコード無変換でも不正な文字コードをはじくなら「 |
すみません。 |
ありがとうございます。
aminophen/platex-tools@aa3851a で対応。
zr-tex8r/PXchfon#10 に issue を立てました。
Man-Ting-Fang/ifxptex#1 に issue を立てました。 |
pTeX に
\ucs
(もともとは upTeX にあったもの,Unicode 値→内部コード)と\toucs
(内部コード→Unicode 値)を実装しました.ASCII の範囲 (0--255) はそのまま通すようにしています.