2018年8月31日金曜日

CentOS7のApache2.4.6でpythonを動かしていたら日本語ディレクトリを取得して表示するときにエラーが出た

題名に割と問題点を詰め込んだ感じになったが、さらなる詳細は以下の通り。
問題点と関係なさそうな情報は面倒なので割愛。

---
@実行環境
CentOS Linux release 7.5.1804 (Core)
Server version: Apache/2.4.6 (CentOS)
Python 3.6.5

@実行内容
Pythonで書かれたindex.cgiにFirefoxで接続。

@予期された動作
取得した日本語のディレクトリ名が表示される。

@結果
/var/log/httpd/error_logに以下のエラーが出力され、表示されない。
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 69-80: surrogates not allowed
---

因みに、このファイルはWindows10上のIISで動かしていた時は問題なく動作していた。
エンコーディング系のエラーだと一目でわかるので、早速以下の関数を実行して結果を見た。

---
print(sys.stdout.encoding)
print(sys.getdefaultencoding())
print(sys.getfilesystemencoding())
print(locale.getlocale())
---

結果はこう。

---
utf-8 utf-8 ascii (None, None)
---

sys.getfilesystemencodingの結果がascii に、locale.getlocaleの結果が(None, None)になっている。しかし、これをコマンドライン上で実行するとこうなる。

---
utf-8
utf-8
utf-8
('en_US', 'UTF-8')
---

つまり、Apacheの問題であることがわかる...ので、色々設定をいじってみたがどうもうまくいかない。
https://itekblog.com/ascii-codec-cant-encode-characters-in-position/」を参考にしたところ、LC_ALLが問題解決の糸口になりそうだ。しかし、LC_ALL=en_US.UTF-8にしても全く変化がない。スクリプト上でlocaleに「en_US.UTF-8」を設定してもasciiのままだ。
「/etc/sysconfig/httpd」で設定するようにしてもやっぱり変わらない。
Apacheのドキュメントをよくよく読むと、SetEnvを使えとある。早速「SetEnv LC_ALL en_US.UTF-8」を追加すると...。

---
utf-8 utf-8 utf-8 ('en_US', 'UTF-8')
---

日本語ディレクトリが使えるようになった。
Apacheはファイルシステムの情報取得にはasciiを標準で使うらしい(ソースのURLは忘れた)。でも、日本人してはやっぱり日本語のファイル・ディレクトリも取得できるようにしたいよね。

0 件のコメント:

コメントを投稿