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