前の関連記事:LibreOffice(55)WSGIでブラウザに結果を出力する
WSGIでブラウザに出力して相方向にやりとりしようと考えていましたが、LibreOfficeからの起動でエラー表示がでるのとオブジェクトを受け渡しするよい方法が思いつかないのでもう単純に内容を出力するだけにしました。
ローカルのhtmlファイルを作成するときにUTF-8を指定しないと枝が文字化けする
libreoffice56.py
workfile.htmlというファイルにhtmlを書き出してそれをデフォルトブラウザの新しいタブに開くようにしました。
一旦ファイルに書き出してからブラウザに開くせいかWSGIで出力するよりもさらに時間がかかります。
WSGIで出力したときはヘッダ情報はなにも書き込まなくてもちゃんと表示されたのですが、何もつけないとFirefoxでは文字エンコーディングが「Unicode」ではなく「西欧」になっています。
それでも別にアルファベットはちゃんと表示されるのですが、問題は枝の部分です。
全部「�」と表示されています。
そこでDOCTYPE-HTML5タグリファレンスを参考にヘッダに<meta charset="UTF-8">を付けてみるました。
文字エンコーディングは「Unicode」になったのですが、文字化けが治りません。
<meta http-equiv="content-language" content="ja">で言語を日本語に指定してもだめです。
さてどうしたものかと思って、workfile.htmlをWindowsのメモ帳で開くと枝はちゃんと表示されています。
ということでブラウザで開くときのコーディングではなくて、workfile.htmlへ書き出すときのコーディングに問題があると気づきました。
with open('workfile.html', 'w') as f: # htmlファイルを作成。すでにあるときは上書き。 f.writelines(self.app(obj)) # シークエンスデータをファイルに書き出し。この10行目のwirtelinesメソッドでファイルを書き出すときにUTF-8で出力するものかと思ったら、そうではなくて9行目のファイルを開くときに文字エンコーディングの指定が必要でした。
with open('workfile.html', 'w', encoding='UTF-8') as f: # htmlファイルをUTF-8で作成。すでにあるときは上書き。 f.writelines(self.app(obj)) # シークエンスデータをファイルに書き出し。これで解決しました。
libreoffice56.py
UTF-8で書き出してもWindows7のメモ帳では文字化けせずにちゃんと表示されていました。
問題は実行速度がすごく遅いことです。かなり待たされます。
LibreOffice(5)PythonでLibreOfficeが動く仕組み:UNOの2つ目のオートメーションで動かすときのLibreOfficeプロセスとPythonプロセスとの間の通信がボトルネックのようです。
1つ目のLibreOfficeの中のScripting Frameworkで動くモード、つまりマクロで呼び出すと一瞬で結果が表示されます。
参考にしたサイト
DOCTYPE-HTML5タグリファレンス
HTML5のタグについてとてもわかりやすく解説してあります。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
Windowsでローカルディスクに保存してからブラウザにファイルを表示させるときはUTF-8を指定します。
0 件のコメント:
コメントを投稿