namazu-dev(ring)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
ja_JP.iso-2022-jp (Re: commit report)
Satoru Takabayashi <satoru-t@xxxxxxxxxxxxxxxxxx> wrote:
>>ISO-2022-JPに詳しい人がいればいいのですが。
>
>さすがに nkf -j ja.po > ja_JP.iso-2022-jp では無理でした。
>こんな感じのフィルタを作って、
>
> while (<>) {
> s/([\xa1-\xfe]+)/\\033\\044\\102$1\\033\\050\\102/g;
> s/([\xa1-\xfe])/escape($1)/ge;
> print;
> }
>
> sub escape {
> $c = $_[0];
> $c =~ tr/\xa1-\xfe/\x21-\x7e/;
> return $c eq "%" ? "%%" : sprintf("\\%03o", ord($c));
> }
>
> % ./make_iso_2022_jp < ja.po > ja_JP.iso-2022-jp
>
>と変換すればうまくいきました。
これではやっぱりだめです。% を %% に無条件に置き換えてしまう
と、printf 以外の関数で悲惨な結果になります。
そこで、ja.po の "#, c-format" を頼りに、
my $c_format = 0;
while (<>) {
$c_format = 1 if /^\#, c-format/;
$c_format = 0 if /^$/;
s/([\xa1-\xfe]+)/\\033\\044\\102$1\\033\\050\\102/g;
s/([\xa1-\xfe])/escape($1)/ge;
print;
}
sub escape {
my ($c) = @_;
$c =~ tr/\xa1-\xfe/\x21-\x7e/;
if ($c_format == 1 && $c eq "%") {
return "%%";
} else {
return sprintf("\\%03o", ord($c));
}
}
のようにして c-format の文字列に対してのみ % を %% に置き換
えればいいような気がします。しかし、
printf(_("foobar"));
のように「printf の引数なのに %s, %d などは使われてない」文
字列にはja.po に "#, c-format" が設定されないため、
ja_JP.iso-2022-jp の日本語訳に % が含まれると悲惨な結果にな
ります。
「%s, %d などを使わないなら、 printf を使うな (fputsを使え)」
という規則を徹底すれば % の問題を回避できますが、うっかり忘
れてしまいそうです。何かいい方法はないかな…。
# ほかに方法がなければそうしますが
-- Satoru Takabayashi