Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

濁点の話

1,891 views

Published on

Unicodeの濁点や半濁点の問題

Published in: Technology
  • Be the first to comment

濁点の話

  1. 1. 濁点の話 emasaka
  2. 2. 7月にkoddolug MLに出したメール ● 「Linux User」C92版のレビューのとき ● これについて解説します ● 勝手にネタにしてすみません >某氏 * (p.1)引用部分で、「で」「プ」「ぐ」「が」「ピ」がNFD(カナと濁点・ 半濁点が分かれている)形式になっています。印刷のとき大丈夫?
  3. 3. 濁点問題 ● Unicodeには濁点や半濁点のついた仮名の表し方 が2種類ある
  4. 4. どういうことか ● この2つの「プ」は、実は別の文字 – (某氏の原稿をLibreOfficeで開いたところ)
  5. 5. 2種類の「プ」 ● U+30D7:「プ」の1文字分で表す – 合成済み文字 – この形式に揃えるのを「NFC(Normalization Form Composition)」正規化という ● U+30D5 309A:「フ」と「゜」(相当)の2文字分のデータで 表す – 結合文字列 – この形式に揃えるのを「NFD(Normalization Form Decomposition)」正規化という – 通称「UTF8-MAC」
  6. 6. NFCとNFD ● LinuxやWindowsではNFCが使われる ● Macのファイル名はNFDであるという問題が、しばしば話題にの ぼる – Macで作ったファイルをLinuxやWindowsで開くときや、MacでLinux由 来のツールを使うときなど – ちなみに最近のmacOS/iOSのAPFSではNFCに変わったらしい ● 実はファイル名だけでなく、テキストやワープロファイルの本文で も問題になる ● しかも正規化されておらず、合成済み文字と結合文字列が混在 する – これが冒頭の「Linux User」での状態
  7. 7. なぜ混在するか ● 自分の想像と聞いた話を総合するとたぶんこう – Mac上で日本語入力した文字は合成済み文字で入力 される – Mac上でほかのアプリ(Webブラウザーなど)からコピ ペした文字は結合文字列で入力される
  8. 8. 何が困るか ● 検索や置換で片方しかヒットしない ● Linux/Windowsの日本語処理系ソフトで結合文 字列だと正常に“その文字”として扱えなかったり ● アプリによって、結合文字列が合成済み文字と同じ ように表示されるものと、されないものがある – LibreOfficeなどでは同じように表示される
  9. 9. ファイル名のNFD→NFC ● convmvで変更できる $ convmv -f utf8 –-nfd -t utf8 –-nfc –notest *
  10. 10. テキストファイル内容のNFD→NFC ● nkfやiconvで変更できる – ただしnkfはNFD→NFCの一方向のみ対応 $ nkf --ic=utf8-mac --oc=utf-8 foo.txt > bar.txt $ iconv -f utf8-mac -t utf8 < foo.txt > bar.txt
  11. 11. Emacsでは ● ucs-normalize-NFC-region(リージョンをNFC正 規化する)とucs-normalize-NFD-region(リージョ ンをNFD正規化する)の2つのコマンドがある ● よく使ってる
  12. 12. Microsoft Word/LibreOffice Writer /Googleドキュメントでは? ● その機能はなさそう ● LibreOffice mini Conference(openSUSE.Asia Summit 2017内)のときに聞いてみたが、やはりな さそう ● フォーマットを崩さずにNFC正規化できる機能がほ しい – LibreOfficeの拡張機能で作る?
  13. 13. 回避策的なツールを作った ● https://github.com/emasaka/docx-normarize-nfc ● まず.docx用 ● .docxをZIPファイルとして開き、コンテンツのXML ファイルをPythonでNFC正規化して書き戻すだけ
  14. 14. 中身はこれだけ #!/usr/bin/env python3 import sys, io, os import unicodedata import zipfile import subprocess DOCUMENT = 'word/document.xml' docx = sys.argv[1] with zipfile.ZipFile(docx) as zf: with zf.open(DOCUMENT) as doc_bytes: doc = io.TextIOWrapper(doc_bytes, encoding='utf-8') document = doc.read() document_nfc = unicodedata.normalize('NFC', document) with open(os.devnull, 'w') as devnull: subprocess.call(['zip', '-d', docx, DOCUMENT], stdout=devnull) with zipfile.ZipFile(docx, 'a') as zf: zf.writestr(DOCUMENT, document_nfc)
  15. 15. これから ● LibreOfficeの拡張機能を作る? ● でも正直、自分の中のプライオリティは高くない
  16. 16. おまけの質問 ● ZIPファイルは圧縮形式として、デフォルトのdeflate のほか、BZipやLZMAなどの形式に対応している ● 質問:ODFやOpen XMLではどの形式に対応して いる?

×