RubyでUTF8とXML書き出し

アップデート:RSSからTwitterに自動投稿をしてくれるTwitterfeedなどのサービスがありますが、これらは下記の2.の「XMLはUTF8をそのままに残す」というのができなくて文字化けを発生させているようです。”&#26085″などの記号はウェブブラウザだと正しく変換して画面に表示してくれますが、ほとんどのTwitterクライアントではこの変換をやらないためです。

丸一日、これで悩んでいました。なんとか解決したので、ここに記録します。

やりたかったこと

  1. UTF8化したデータをXMLに書き出す。
  2. XMLファイルはUTF8をそのままに残す。例えば”日本語” => “日&amp#26412;&amp#35486;”という変換はしない。
  3. 大きいXMLファイルを書き出したいので、XMLをすべてメモリに溜め込んでから書き出すのではなく、少しずつファイルに書き出す。

そんなに珍しいことをやろうという訳でもないので、簡単にできるかなと思ったのですが、これがなかなか大変でした。Ruby 1.9ではもう少し簡単になっているかもしれませんが、少なくともRuby 1.8では大変です。

その1:Ruby標準ライブラリのREXMLを使うという選択肢

採用せず

  1. まず、REXMLはバグが多い。例えばXMLをインデント整形するだけでバグ。
  2. 少しずつファイル書き出しはできない。

その2:Ruby on RailsのActiveSupportについてくるBuilder (version 2.1.2)

採用せず

  1. ファイルを少しずつ書き出すことができるのは大きなプラス。
  2. しかし”日本語” => “日&amp#26412;&amp#35486;”は起きる。

その3:Nokogiri

採用せず

  1. “日本語” => “日&amp#26412;&amp#35486;”は起きないというのは大きなプラス。
  2. しかしファイルを少しずつ書き出すことはできない。

その4:Builderの最新バージョン (Githubにある version 2.2.0以上)

採用。以下の感じで使いました。

[ruby]
$KCODE = ‘UTF8’
require ‘rubygems’
gem ‘bigfleet-builder’
require ‘builder’
x = Builder::XmlMarkup.new(File.open(“output_file.xml”, “w”), :indent => 1)
x.instruct!(:xml, :encoding => “UTF-8”)
1000.times do
x.product do
x.name(“日本語”)
end
end
[/ruby]

Railsでは処理速度を向上させるために、fast_xs gemがインストールされていればこれを読み込んでBuilderをパッチしています。しかしバージョン 2.2.0のBuilderはXmlBase#_escape内で、String#to_xsを引数付きで呼び出しているので、引数を取らないfast_xsのto_xsとコンパチではなくなっている感じです。

例えば

[ruby]
$KCODE = ‘UTF8’
require ‘rubygems’
gem ‘bigfleet-builder’
require ‘builder’
require ‘active_support’
x = Builder::XmlMarkup.new(File.open(“output_file.xml”, “w”), :indent => 1)
x.instruct!(:xml, :encoding => “UTF-8”)
1000.times do
x.product do
x.name(“日本語”)
end
end
[/ruby]

とすると、ArgumentError: wrong number of arguments (1 for 0) : method to_xs in xmlbase.rb at line 118と怒られます。

これを解消するためには fast_xs を使わないようにmonkey patchします。

[ruby]
$KCODE = ‘UTF8’
require ‘rubygems’
gem ‘bigfleet-builder’
require ‘builder’
require ‘active_support’

class String
alias_method :to_xs, :original_xs if method_defined?(:original_xs)
end

x = Builder::XmlMarkup.new(File.open(“output_file.xml”, “w”), :indent => 1)
x.instruct!(:xml, :encoding => “UTF-8”)
1000.times do
x.product do
x.name(“日本語”)
end
end
[/ruby]

かなり美しくないのですが、これでようやくなんとかXMLがやりたいように書き出せるようになりました。

バイオメーカーの日本語ウェブを作るために必要なインフラ

昨日、「PNE(蛋白質核酸酵素)」という日本語雑誌の廃刊休刊と、そもそも日本語で書かれたライフサイエンスの学術誌が必要かという議論がされていました。僕はメーカーにいた経験から、英語で書かれた情報よりも日本語で書かれた情報に圧倒的に反応がよいという経験を紹介しました。

似たような話として、バイオのメーカーがカタログ、ウェブや使用説明書などを日本語翻訳するべきかどうかという議論があります。

僕自身は帰国子女だということもあり、研究をしていた頃は日本語の情報は不要だと考えていました。しかしメーカーで勤務するようになると、逆に日本語化の重要性を認識するようになりました。日本語化の重要性のポイントはざっと以下の通りです。

  1. 実際に種々の販促活動をしていると、英語の情報よりも日本語の情報の方が圧倒的に顧客の食いつきがいい。
  2. 特に企業では研究アシスタントの方がむしろメインで実験していることが多く、この人たちは英語は読めない。
  3. 研究者の多くも英語が楽に読めるとは限らない。極端な例としては臨床医が学位を取るために研究しているケースで、この人たちは研究を続ける訳ではなく、英語論文を頻繁に読むとは限らない。また一般的の研究者でも、英語力は実際にはピンキリ。
  4. メーカー営業および代理店担当者も製品情報を見て勉強している。この人たちは総じて英語力はない。したがって英語のままだと、営業の人が製品を積極的に顧客に紹介してくれない。
  5. 米国の倍以上の値段で製品を販売していることも多いのだから、それぐらいの努力はしようぜ!(これは必要性云々よりも良心の問題)

ただし実際に翻訳の活動を行っていると、多くの問題点もあります。

  1. 翻訳の手間が大変。生命科学に精通している翻訳家というのは珍しいため、外部に委託するととんでもない翻訳になってしまうことが多い。そのため、結局はメーカーの学術などが翻訳作業をかなり担うことになる。
  2. バージョン管理がされていない。英語の資料は不定期に黙って更新されることが多く、どこが更新されたかも教えてくれない。そのため、日本語翻訳した資料が気づかないうちに古くなってしまうことが多い。最初の日本語か作業の大変さよりも、この更新作業がうまくいかないために苦労していることが多い。
  3. すべての製品を一気に日本語化するのは現実的でないことが多いので、翻訳できているものは日本語を表示し、翻訳できていないものは
  4. ウェブの場合は、そもそも日本語が使えないシステムになっていることが多い。最近は米国を中心にウェブカタログを電子購買システムと連動させていることが多くなっているが、投入した開発費をまかなうために、日本独自で開発したウェブをやめさせることが多くなっている。しかし米国で開発したシステムは多言語対応になっていないことがほとんど。

じゃー、どうすればいいんだという話です。

僕もこれを実際にできたという訳ではないのですが、今までの経験から以下のようなインフラがあれば、少なくともウェブぐらいは比較的少ない負担で日本語化できるのではないかと考えています。いずれかはこういうのを作りたいという気持ちと、誰かがこれを参考に作ってくれればうれしいという気持ちを込めて、メモ程度に記します。

  1. まずは英語のウェブから情報を取り込むシステムが必要。このためには、自動的に英語ウェブを巡回して、すべてのページをとってくるプログラムが必要。
  2. 次に、英語ウェブでどのような更新があるのかを分かりやすく表示するためのシステムが必要。前項で巡回したデータを使って、差分をとっていけば分かるはず。
  3. 日本語の翻訳を管理するためのシステム。翻訳支援ソフトでは翻訳メモリというのがあるが、こういうものでかなり省力化できるはず。各メーカーは似たような製品をたくさん扱っているので、繰り返し何度も使われているフレーズが多くあるはず。
  4. 日本語の翻訳のバージョン管理システム。誰がいつどのような変更を加えたかを記録するシステム。多数の人が関わって作業をする場合、こういうのがないとうまくいかない。
  5. 英語ウェブサイトで使用しているシステムが日本語にも対応していて、訪問者の国によって表示が切り替わるものになっていればいいのだが、ほとんどのメーカーではこのようになっていない。通常は英語しか表示できないシステムが使用されている。そこで別途、日本用にシステムを作る必要がある。
  6. 前項のシステムは、自動的に英語ウェブサイトの情報が取り込み、日本語の翻訳が用意されていないページについては英語を表示するようになっている必要がある。

こんな感じのものを統合したシステムであれば、ウェブの日本語化はかなり楽に、きっちりできると思います。ただ、ここのところ日本のバイオのマーケットが伸び悩んでいるので、こういうシステムを作るだけの投資ができる会社もなくなってしまっているのが、悲しい現実のようにも思います。