acute accentの処理
世の中にはacute accentという文字があるそうだ.
Charbase U+00B4: ACUTE ACCENT
アポストロフィーに形が似ているが,その実体はラテン系の言語に使用するアクセント記号である.Latin-1 supplemetの文字セットの中に含まれている.
ところで,acute accentを持った文字列を含むデータ構造を何らかの手段でファイルに書き出そうとすると,UnicodeEncodeErrorが発生してしまう.
例えば,いまのケースだと,マップ(pythonだと辞書)の中にacute accentが存在しているとする.このマップをjsonファイルに書き出そうとすると,
kensuke-mi@pine14:/work/kensuke-mi/performance_perlex$ python lex_to_json.py Traceback (most recent call last): File "lex_to_json.py", line 66, in <module> main(); File "lex_to_json.py", line 62, in main json.dump(after_inf_dictionary, f, indent=4, ensure_ascii=False) File "/home/kensuke-mi/lib/python2.7/json/__init__.py", line 182, in dump fp.write(chunk) UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 9: ordinal not in range(128)
というエラーが出る.
これを回避するためには,「utf-8にエンコードし直したマップ」を作成して,そのマップを書き出したらよい.例えば,今のケースだと,下のコードで新しいマップを作り直す.
after_inf_dictionary_str_utf={}; for k, v in after_inf_dictionary.iteritems(): new_key=unicode(k).encode('utf-8'); new_value=unicode(v).encode('utf-8'); after_inf_dictionary_str_utf.setdefault(new_key, new_value);
こうすると,見事に解決する
おそらく原因はpythonのユニコード体系にこのacute accentが組み込まれていないことだと思う.現にpython内部ではu'\xb4'として処理されているが,実際はU+00B4というれっきとしたunicode番号が与えられている.どうしてこうなったか?はぜんぜんわかりません...
参考
encoding - Error with urlencode in python - Stack Overflow