FrameMakerにインポートしたXMLデータ文字化け対処方法
たとえば、ラテン文字のチルダ付aなどを含んだXMLデータ(UTF-8)を FrameMaker7.xにインポートすると文字化けが発生してしまう。
FrameMaker7.xでは、ユニコードを直接扱わないで、 各言語ごとの文字エンコードを使っているため、 たとえば、XMLデータがUTF-8でエンコードされたいた場合、FrameMakerに インポート時に文字の変換が行われ、 この時に文字化けが発生するようです。(あくまで推測ですが)
ちなみに、FrameMaker8では、FrameMaker自体がユニコードを 扱うため、インポート時に文字の変換が行われないため、 この手の文字化けが発生しないようです。
チルダ付aが文字化けする
対処方法自体はシンプル。チルダ付a(ã)を ã に置き換えた上で、 FrameMakerにインポートしなおします。 これで問題解決。
ただし、このような置き換えはたくさん発生するし、 置き換えの必要なキャラクタは、aチルダだけではありません。
また、XMLデータ編集時に、aチルダを書くべきところを ã などと 書いていくのは苦痛でしょう。
したがって、FrameMakerへのインポート直前にプログラムで機械的に 変換を行うのが一番良さそうです。
exを使う
以下のようなexscriptを作成しておいて
%s/チルダ付a/\ã/g
w
※チルダ付a ... のところは、ã です、実際は。
$ ex foo.xml < exscript
これで一括置き換えできます。 しかし、わたしが使っている環境では、チルダ付aが表示できなかったため、 (したがって入力する方法も良く分からない)jythonで対処することにしました。
たまたまjythonでやっていますが、Javaでやっても同じことだと思います。
jythonで置き換え処理する
ポイントは、 チルダ付aが直接入力できないので、ユニコードで指定します。
チルダ付aの文字コードを調べるには、 http://www.unicode.org/charts/ を参考に探します。
replace.py
import sys
import java.lang as lang
import java.io as io
import org.apache.commons.io as cio
def toString(inf):
fis=io.FileInputStream(inf)
text=cio.IOUtils.toString(fis,"UTF-8")
fis.close()
return text
file=io.File(sys.argv[1])
text=toString(file)
text=lang.String(text).replaceAll('\u00E3',"\&atilde;")
text=lang.String(text).replaceAll('\u00E7',"\&ccedil;")
print text
- この例では、チルダ付aだけでなく、セディラ付cも置き換えしています。
- 結果の出力は print で済ませていますが、実際には、エンコードを指定して出力した方がいいでしょう、でないと環境によっては新たな文字化けが発生してしまいます。
実行するには、
$ jython replace.py foo.xml
※commons-io を使っているので、commons-io-1.1.jar 等へクラスパス通す必要あり。