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

More Related Content

PDF
YJTC19 B-5 Kubernetesで実現したYahoo! JAPANの次世代開発環境 ~ 100以上のクラスタを少人数で運用する秘訣 ~ #yjtc
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
PDF
ドメイン駆動で開発する ラフスケッチから実装まで
PDF
ノンプログラマーのためのjQuery入門
PDF
マイクロにしすぎた結果がこれだよ!
PDF
LINE LIVE のチャットが
30,000+/min のコメント投稿を捌くようになるまで
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
YJTC19 B-5 Kubernetesで実現したYahoo! JAPANの次世代開発環境 ~ 100以上のクラスタを少人数で運用する秘訣 ~ #yjtc
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
強いて言えば「集約どう実装するのかな、を考える」な話
ドメイン駆動で開発する ラフスケッチから実装まで
ノンプログラマーのためのjQuery入門
マイクロにしすぎた結果がこれだよ!
LINE LIVE のチャットが
30,000+/min のコメント投稿を捌くようになるまで
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)

What's hot (20)

PDF
ドメイン駆動設計のための Spring の上手な使い方
PPTX
イベント・ソーシングを知る
PDF
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
PDF
オブジェクト指向の設計と実装の学び方のコツ
PDF
テスト文字列に「うんこ」と入れるな
PDF
Cycloudのストレージ紹介と歴史
PDF
オブジェクト指向プログラミングのためのモデリング入門
PDF
IaC事始め Infrastructure as Code やってみる?
PDF
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
スマートフォン向けサービスにおけるサーバサイド設計入門
PDF
負荷テストを行う際に知っておきたいこと 初心者編
PPTX
あなたのところに専用線が届くまで
PPTX
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
PDF
世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]
PDF
JVMのGCアルゴリズムとチューニング
PDF
イミュータブルデータモデルの極意
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
PPTX
概念モデリング再入門 + DDD
PDF
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
ドメイン駆動設計のための Spring の上手な使い方
イベント・ソーシングを知る
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
オブジェクト指向の設計と実装の学び方のコツ
テスト文字列に「うんこ」と入れるな
Cycloudのストレージ紹介と歴史
オブジェクト指向プログラミングのためのモデリング入門
IaC事始め Infrastructure as Code やってみる?
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
スマートフォン向けサービスにおけるサーバサイド設計入門
負荷テストを行う際に知っておきたいこと 初心者編
あなたのところに専用線が届くまで
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]
JVMのGCアルゴリズムとチューニング
イミュータブルデータモデルの極意
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
概念モデリング再入門 + DDD
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
Ad

More from emasaka (12)

PDF
ibus-skkをなんとかすっぺ会議
PDF
GoBoLinuxを試した
PDF
さくらのクラウドでh2oのベンチマーク
PDF
みおぽん for CLI
PDF
GNU make 4.0に何かいる
PDF
メタメタプログラミングRuby
PDF
長いの
PDF
)の品格
PDF
人力
PDF
エコなWebサーバー
PDF
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
PDF
Bash on Railsの逆襲
ibus-skkをなんとかすっぺ会議
GoBoLinuxを試した
さくらのクラウドでh2oのベンチマーク
みおぽん for CLI
GNU make 4.0に何かいる
メタメタプログラミングRuby
長いの
)の品格
人力
エコなWebサーバー
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
Bash on Railsの逆襲
Ad

Recently uploaded (10)

PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
PPTX
Vibe Codingを触って感じた現実について.pptx .
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
PDF
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
Vibe Codingを触って感じた現実について.pptx .
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
20250823_IoTLT_vol126_kitazaki_v1___.pdf
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ

濁点の話