SlideShare a Scribd company logo
Copyright 2020 @nuits_jp
Unicodeで半角全角を扱う
Ambiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Atsushi Nakamura
Copyright 2020 @nuits_jp
Easiest Clean Architecture
About Me
Copyright 2020 @nuits_jp Slide 3
About Me
中村 充志 / Atsushi Nakamura
• リコージャパン株式会社 所属
• Enterprise(おもに金融)系SIerのITアーキテクト
• 「持続可能なソフトウェア」の探求がライフワーク
• 2020年の目標
1. 「CleanArchitecture」について登壇したい
2. 「xUnit & Moqハンズオン」開催
3. 構成管理フレンドリーなERモデリングツール作成
• Blog http://www.nuits.jp
• Blog(英語) https://blog.nuits.jp
• Twitter @nuits_jp
Copyright 2020 @nuits_jp Slide 4
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
みなさん、こんな経験はありませんか?
Copyright 2020 @nuits_jp Slide 5
例えばこんなとき
• 新しいAPIをお試しで利用するとき、その結果を表示させたい
• 簡単なツールを作るのだがGUIはやりすぎなのでCUIでつくりたい
そして・・・
Overview
Slide 5
Copyright 2020 @nuits_jp Slide 6
コンソールにテーブル形式で結果表示したい!
Copyright 2020 @nuits_jp Slide 7
そんなときの心強い味方
「ConsoleTales」
• https://github.com/khalidabuhakmeh/ConsoleTables
ConsoleTables
Slide 7
Copyright 2020 @nuits_jp Slide 8
でもこれ・・・
Copyright 2020 @nuits_jp Slide 9
全角を使うとレイアウトが崩れてしまいます
全角が・・・
Copyright 2020 @nuits_jp Slide 10
と、いうわけで・・・
Copyright 2020 @nuits_jp Slide 11
全角対応テキストテーブルライブラリを作るしか!?
Copyright 2020 @nuits_jp Slide 12Slide 12
できました!
Copyright 2020 @nuits_jp Slide 13
FluentTextTable
FluentTextTable
• https://github.com/nuitsjp/FluentTextTable
簡単で、柔軟かつ流暢(Fluent)にレイアウトをカスタマイズできるテキスト
テーブルライブラリです。
NuGetから利用可能です。
Slide 13
Copyright 2020 @nuits_jp Slide 14
Basic
Copyright 2020 @nuits_jp Slide 15
Markdown対応
Copyright 2020 @nuits_jp Slide 16
改行や配列を含むプロパティ対応
Copyright 2020 @nuits_jp Slide 17
アライメントや詳細なフォーマットに対応
箇条書きとか!
Copyright 2020 @nuits_jp Slide 18
Borderのカスタマイズ
Copyright 2020 @nuits_jp Slide 19
MarginとPadding
Copyright 2020 @nuits_jp Slide 20
まぁ・・・振り返って気がつきました・・・
Copyright 2020 @nuits_jp Slide 21
やりすぎました!
Copyright 2020 @nuits_jp Slide 22Slide 22
でもこれ実は
Copyright 2020 @nuits_jp Slide 23Slide 23
苦難の連続でした
Copyright 2020 @nuits_jp Slide 24Slide 24
そんな訳で聞いてください
Copyright 2020 @nuits_jp Slide 25
Unicodeで半角全角を扱う
Ambiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Atsushi Nakamura
Copyright 2020 @nuits_jp Slide 26
Unicodeには文字を分類するための各種辞書が規定されています。
東アジア圏の全角・半角を分類するための辞書もあります。
UAX #11: East AsianWidth – Unicode
• http://www.unicode.org/reports/tr11/tr11-38.html
• http://ftp.unicode.org/Public/UNIDATA/EastAsianWidth.txt
Unicodeにおける全角・半角判定
Copyright 2020 @nuits_jp Slide 27
これを読んで処理すれば解決なんですが・・・
Copyright 2020 @nuits_jp Slide 28
まず辞書を読むのが面倒
Copyright 2020 @nuits_jp Slide 29
よく見ると・・・・
• 「;」の前が文字コードのレンジ、その後ろが種別
• レンジは範囲と単独がある
• 未定義のとび版がある
Unicodeにおける全角・半角判定
Copyright 2020 @nuits_jp Slide 30
• 同じ種別なのに単一の範囲ではなく複数に分けられている
(文字の中身の種類が違うから)
Copyright 2020 @nuits_jp Slide 31
と、いうわけで
Copyright 2020 @nuits_jp Slide 32
まず全角・半角判定ライブラリを作ることにしました
Copyright 2020 @nuits_jp Slide 33Slide 33
できました!
Copyright 2020 @nuits_jp Slide 34
EastAsianWidthDotNet
EastAsianWidthDotNet
https://github.com/nuitsjp/EastAsianWidthDotNet
• 辞書をパースするサポートライブラリを作成
• パース結果を無駄を省いて最適化
• 辞書などのリソースを都度読むと遅いのでT4テンプレートでコード生成
Copyright 2020 @nuits_jp Slide 35
で実感します
Copyright 2020 @nuits_jp Slide 36
Ambiguous(曖昧)について
Copyright 2020 @nuits_jp Slide 37
辞書は文字コードの範囲と、対象範囲の種別が規定されている。
EastAsianWidthの種別は6つ
• Ambiguous
• Fullwidth
• Halfwidth
• Narrow
• Wide
• Neutral
これらが言語圏によって扱いが規定されている。
Unicodeにおける全角・半角判定
Copyright 2020 @nuits_jp Slide 38
種別 東アジア それ以外
Ambiguous 全角 半角(正確にはnarrow)
Fullwidth 全角 未使用
Halfwidth 半角 未使用
Narrow 半角 半角(正確にはnarrow)
Wide 全角 未使用
Neutral 半角 半角(正確にはnarrow)
Unicodeにおける全角・半角判定
ウィキペディアより
A(Ambiguous; 曖昧)
文脈によって文字幅が異なる文字。東アジアの組版とそれ以外の組版の両方に出現し、
東アジアの従来文字コードではいわゆる全角として扱われることがある。
ギリシア文字やキリル文字など。
Copyright 2020 @nuits_jp Slide 39
なるほど!
ギリシャ文字とキリル文字の言語圏を
調べて特殊処理すればいいんだな!
👆勘違い
Copyright 2020 @nuits_jp Slide 40
CultureInfoをひとつづつ全部調べた。数日使った。 👈勘違い
途中までしらべた
Copyright 2020 @nuits_jp Slide 41
ここまできて「はた」と気が付きました
Copyright 2020 @nuits_jp Slide 42
Not東アジアって英語圏とかも全部じゃん?
Copyright 2020 @nuits_jp Slide 43
「Not東アジア」ではなく「東アジア」を判定する
Copyright 2020 @nuits_jp Slide 44
東アジアのCultureInfoのプレフィックス
総当たりで調べた!(漏れてたら教えてください)
Copyright 2020 @nuits_jp Slide 45
完成!
Copyright 2020 @nuits_jp Slide 46Slide 46
と思ったところから「闇」の始まりだった
Copyright 2020 @nuits_jp Slide 47
種別 東アジア それやめろ文字
Ambiguous 全角
Neutral 半角
闇の入口
Copyright 2020 @nuits_jp Slide 48
種別 東アジア それやめろ文字
Ambiguous 全角
Neutral 半角
闇の入口
Copyright 2020 @nuits_jp Slide 49
種別 東アジア それやめろ文字
Ambiguous 全角
Neutral 半角
闇の入口
Copyright 2020 @nuits_jp Slide 50
種別 東アジア それやめろ文字
Ambiguous 全角
Neutral 半角
闇の入口
Copyright 2020 @nuits_jp Slide 51Slide 51
ん~。フォントファイル解析して文字幅測定するか?
Copyright 2020 @nuits_jp Slide 52Slide 52
ダメでした
Copyright 2020 @nuits_jp Slide 53
闇の入口
ここになんの変哲もない砂時計があります。
Copyright 2020 @nuits_jp Slide 54
闇の入口
ここになんの変哲もない砂時計があります。
これを8個並べましょう。
Copyright 2020 @nuits_jp Slide 55
闇の入口
ここになんの変哲もない砂時計があります。
これを8個並べましょう。
Copyright 2020 @nuits_jp Slide 56
闇の入口
ここになんの変哲もない砂時計があります。
これを8個並べましょう。
えっ!?
Copyright 2020 @nuits_jp Slide 57
さん。まさかの0.75角!?
Copyright 2020 @nuits_jp Slide 58
続けて調べると、怪しい文字がぞろぞろ・・・
Copyright 2020 @nuits_jp Slide 59
結論
Copyright 2020 @nuits_jp Slide 60
完璧を追い求めるのは無理。
怪しい文字が崩れるのは諦めろ。
結論
Slide 60
Copyright 2020 @nuits_jp Slide 61
そして月日は流れる
Copyright 2020 @nuits_jp Slide 62
FluentTextTable完成!
Copyright 2020 @nuits_jp Slide 63
で、思うわけですよ
Copyright 2020 @nuits_jp Slide 64
日本人なら・・・
こんな感じで罫線文字(┌┬┘とか)使いたいよね?
Borderは全角にもマルチ文字にもカスタマイズ可能!
デフォルトのプリセット作るか!
Copyright 2020 @nuits_jp Slide 65
日本人なら・・・
こんな感じで罫線文字(┌┬┘とか)使いたいよね?
Borderは全角にもマルチ文字にもカスタマイズ可能!
デフォルトのプリセット作るか!
👇できました!
Copyright 2020 @nuits_jp Slide 66
動かしました!
Copyright 2020 @nuits_jp Slide 67
(*´Д`)はぁ・・・?
Copyright 2020 @nuits_jp Slide 68
メモ帳様ならちゃんと!
Copyright 2020 @nuits_jp Slide 69
あれ?
Copyright 2020 @nuits_jp Slide 70
あれれ??
これはもしや・・・
Copyright 2020 @nuits_jp Slide 71
?
ここに「─(罫線)」があるじゃろ?
( ^ω^)
⊃─⊂
Copyright 2020 @nuits_jp Slide 72
?
ここに「─(罫線)」があるじゃろ?
( ^ω^)
⊃─⊂
これを「〇」と合わせて
( ^ω^)
≡ ≡
Copyright 2020 @nuits_jp Slide 73
?
ここに「─(罫線)」があるじゃろ?
( ^ω^)
⊃─⊂
これを「〇」と合わせて
( ^ω^)
≡ ≡
こうじゃ!
( ^ω^)
⊃ ⊂
Copyright 2020 @nuits_jp Slide 74
ええっ!?
貫通してる!?
Copyright 2020 @nuits_jp Slide 75
あっっぽーぺん!?
Copyright 2020 @nuits_jp Slide 76
コンソールのバグ・・・
Copyright 2020 @nuits_jp Slide 77
いや、まだあわてるような時間じゃない
Copyright 2020 @nuits_jp Slide 78Slide 78
きっと我らの「WindowsTerminal」様なら・・・
Copyright 2020 @nuits_jp Slide 79
ダメでした!
貫通はしない!
だがしかし!
半角!
それでもおれらの「WindowsTerminal様なら
Slide 79
Copyright 2020 @nuits_jp Slide 80
諦めました
Copyright 2020 @nuits_jp Slide 81Slide 81
Unicodeで半角全角を扱う
Ambiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Copyright 2020 @nuits_jp Slide 82Slide 82
味わっていただけましたか?
Copyright 2020 @nuits_jp Slide 83
ThankYou!
おしまい!

More Related Content

PPTX
結果を出すチームビルディング術
PDF
ChatGPT、 何が「できる」「みえる」ようになってきたのか!
PDF
Mind maps pathology
PPTX
振り返り(アジャイルレトロスペクティブズ)
PDF
AgileJapan2010 佐賀県庁でもできる!プロジェクトファシリテーション
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
PDF
なぜソフトウェアアーキテクトが必要なのか - Devlove 20110423
PDF
MPIによる並列計算
結果を出すチームビルディング術
ChatGPT、 何が「できる」「みえる」ようになってきたのか!
Mind maps pathology
振り返り(アジャイルレトロスペクティブズ)
AgileJapan2010 佐賀県庁でもできる!プロジェクトファシリテーション
サイエンス領域におけるMLOpsの取り組み #yjtc
なぜソフトウェアアーキテクトが必要なのか - Devlove 20110423
MPIによる並列計算

What's hot (20)

PDF
Introduction to boost test
PDF
第 1 回 Jetson ユーザー勉強会
PDF
MoveItの新機能、 OMPL Constrained Planningを試してみた
PDF
アジャイルとスクラムとは 原則、価値、プラクティス
PDF
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
PDF
ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社
PDF
AnsibleではじめるNW設定の自動化について - Cisco(VIRL)編 -
PDF
Digitaltransformation Journey
PDF
いまさら聞けないarmを使ったNEONの基礎と活用事例
PDF
歩行支援機能を有する前腕支持型四輪歩行器の開発に関する研究
PDF
ソースコードの品質向上のための効果的で効率的なコードレビュー
PDF
Casewise Corporate Modeler
PPTX
軟體開發之路甘苦談(Gelis)
PDF
やりなおせる Git 入門
PPTX
ChatGPT以後の時代をどう生きるか PWA Night vol.51
PDF
Git LFSを触ってみた
PDF
Test Yourself - テストを書くと何がどう変わるか
PPTX
研究オープンデータにおける大学と研究者の役割
PPTX
今さら聞けないITエンジニアのための7つの習慣
PDF
TensorRT Inference Serverではじめる、 高性能な推論サーバ構築
Introduction to boost test
第 1 回 Jetson ユーザー勉強会
MoveItの新機能、 OMPL Constrained Planningを試してみた
アジャイルとスクラムとは 原則、価値、プラクティス
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社
AnsibleではじめるNW設定の自動化について - Cisco(VIRL)編 -
Digitaltransformation Journey
いまさら聞けないarmを使ったNEONの基礎と活用事例
歩行支援機能を有する前腕支持型四輪歩行器の開発に関する研究
ソースコードの品質向上のための効果的で効率的なコードレビュー
Casewise Corporate Modeler
軟體開發之路甘苦談(Gelis)
やりなおせる Git 入門
ChatGPT以後の時代をどう生きるか PWA Night vol.51
Git LFSを触ってみた
Test Yourself - テストを書くと何がどう変わるか
研究オープンデータにおける大学と研究者の役割
今さら聞けないITエンジニアのための7つの習慣
TensorRT Inference Serverではじめる、 高性能な推論サーバ構築
Ad

More from Atsushi Nakamura (20)

PPSX
Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
PPTX
C#メタプログラミング概略 in 2021
PPTX
世界一わかりやすいClean Architecture - DroidKaigiバージョン
PPTX
世界一わかりやすいClean Architecture
PPTX
世界一わかりやすいClean Architecture release-preview
PPTX
世界一わかりやすいClean Architecture alpha-1
PPTX
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
PPTX
Desktop app dev strategy for .net core 3.0
PPTX
継続的にテスト可能な設計を考える
PPTX
継続的にテスト可能な設計を考える ベータ版
PPTX
α版 継続的にテスト可能な設計を考える
PDF
App center analyticsを使い倒そう
PPTX
Old:App center analyticsを使い倒そう
PPTX
Xamarin.forms navigation overview
PPTX
App center analyticsを使い倒そう
PPTX
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
PPTX
Blue monkey architecture overview
PPTX
Xamarin Dev days 2 xamarin.forms ja
PPTX
Why prism for xamarin.forms
PPTX
Enterpriseから見たXamarinの可能性
Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
C#メタプログラミング概略 in 2021
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture alpha-1
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Desktop app dev strategy for .net core 3.0
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える ベータ版
α版 継続的にテスト可能な設計を考える
App center analyticsを使い倒そう
Old:App center analyticsを使い倒そう
Xamarin.forms navigation overview
App center analyticsを使い倒そう
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Blue monkey architecture overview
Xamarin Dev days 2 xamarin.forms ja
Why prism for xamarin.forms
Enterpriseから見たXamarinの可能性
Ad

Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖