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