[l3regex] [upTeX] 和文文字と欧文バイトがマッチしてしまう
Opened this issue · 1 comments
以下のコードでupTeXではUTF-8バイト列中の欧文バイトまで置換されてしまう。
% UTF-8で保存。
\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl {±ñıűƱDZȱɱ }
\regex_replace_all:nnN {±} {*} \l_tmpa_tl
\tl_show:N \l_tmpa_tl
\ExplSyntaxOff
upTeX:
> \l_tmpa_tl=*^^c3*^^c4*^^c5*^^c6*^^c7*^^c8*ɱ.
pTeX:
> \l_tmpa_tl=*^^c3^^b1^^c4^^b1^^c5^^b1^^c6^^b1^^c7^^b1^^c8^^b1^^c9^^b1.
l3regexでは文字トークンはカテゴリコードによらずマッチするため、upTeXの場合は文字コードが128--255の和文文字と欧文バイトがマッチしてしてしまう。
interface3.pdf "8.1.2 Characters in regular expressions" より
Most characters match exactly themselves, with an arbitrary category code.
l3regex 内部では例えば ±
は \__regex_item_caseful_equal:n {177}
のように表現されており、そこには文字コードしかないため和文と欧文を区別することができない。
l3regex ではカテゴリコードを指定したマッチもできる。これを使って和文と欧文お区別を表現で起訴だが、例えば \c[LO] A
(カテゴリコード 11 (letter) または 12 (other))は \__regex_item_catcode:nT {20971520}{\__regex_item_caseful_equal:n {65}}
のように表現されている。この 20971520 は
【案1】\__regex_item_jachar_equal:n
等を用意し和文ならこちらを欧文なら \__regex_item_caseful_equal:n
をつかう。
【案2】和文なら \__regex_item_jachar:T {...}
、欧文なら \__regex_item_jachar:F {...}
のようにする。
どちらにしてもマッチング時は l3tl-analysis によって文字コードとカテゴリコードを取得しているので #3 を何とかしないとどうしようもない。