Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

濁点の話

8 282 vues

Publié le

Unicodeの濁点や半濁点の問題

Publié dans : Technologie
  • Login to see the comments

濁点の話

  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ではどの形式に対応して いる?

×