SlideShare una empresa de Scribd logo
1 de 16
Descargar para leer sin conexión
濁点の話
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ではどの形式に対応して
いる?

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
営業さんまで、社員全員がSQLを使う 「越境型組織」 ができるまでの3+1のポイント | リブセンス
営業さんまで、社員全員がSQLを使う 「越境型組織」 ができるまでの3+1のポイント | リブセンス営業さんまで、社員全員がSQLを使う 「越境型組織」 ができるまでの3+1のポイント | リブセンス
営業さんまで、社員全員がSQLを使う 「越境型組織」 ができるまでの3+1のポイント | リブセンス
 
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
「Redmineの運用パターン集~私に聞くな、チケットシステムに聞け」
「Redmineの運用パターン集~私に聞くな、チケットシステムに聞け」「Redmineの運用パターン集~私に聞くな、チケットシステムに聞け」
「Redmineの運用パターン集~私に聞くな、チケットシステムに聞け」
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
 
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
楽天のインフラ事情 2022
楽天のインフラ事情 2022楽天のインフラ事情 2022
楽天のインフラ事情 2022
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
ここが良かったDatadog
ここが良かったDatadogここが良かったDatadog
ここが良かったDatadog
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 

Más de emasaka (12)

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

Último

Último (11)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 

濁点の話