2010年08月30日

VC++ で UTF-8ファイルがコンパイルできないとき、

先日、VC++で UTF-8で保存されたファイルのコンパイルに失敗して、面倒くさがってSHIFT_JIS版に逃げてしまったたわけですが、今回はその回避策です。

escapize.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
import os
import re

def convert(n):
if not n: return
f = open(n,'r')
data = f.read()
f.close()

d = False
a = ''
for c in data:
if ord(c) >= 0x80:
d = True
a += u'\\x%0X' % (ord(c))
else:
a += c

if d:
print n
f = open(n,'w')
f.write(a.encode('sjis'))
f.close()

def rec_exec(func,p):
if not func: return
for n in os.listdir(p):
f = os.path.join(p,n)
if os.path.isfile(f):
if re.search( '\.(h|c)$', n ):
func(f)
elif os.path.isdir(f):
rec_exec(func,f)

rec_exec(convert,'.')

0x80 以上の文字コードを16進数表記エスケープシーケンスに置き換えていくだけです。そのソースのフォルダに置いて、この Python スクリプトを実行すれば、再帰的にファイルを見つけて変換してくれます。
欠点として、ソースの日本語が読めなくなってしまいます。そのため変換しない原版を別に残しておかないといけません。逆変換のスクリプトを作るという手もありますが、これこそ面倒なので作りません。

とにかく、これで Windows 版の Open Jtalk で UTF-8 版の辞書も使えるようになりました。


posted by takayan at 03:09 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。