SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
全角チルダ問題
@tsuda_ahr
LTDD#5 2014/7/5
2014/7/7 改訂2版
今回のネタの発端
こんな書き込みを見つけまして。
全角チルダ
~
波ダッシュ
〜
違いがわかりましたね?
問い) どっちが波ダッシュ?
~ ~
答え)
どっちも全角チルダ(汗
なんでこんなことに?
• しらん
参考) 確かめかた (Windows の場合)
• 確かめたい文字をコピーします。
• WordPad を起動し、コピーした文字を貼り付けます。
• 確かめたい文字を一文字選択し、ALT + X を押します。
• コード (UCS-4) が表示されます。
• U+301C が波ダッシュ
• U+FF5E が全角チルダ
基礎知識1) チルダとは何か?
• こういうやつらしい。
ÃÕÑ
• 鼻音に関する音をあらわす、ダイアクリティカルマークの一種
• ダイアクリティカルマークってこんなやつら (よくしらない)
À Á Â Ä Å Ă Ą Ā
http://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%A2%E3%82%AF%E3%83%AA%E3%83
%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%9E%E3%83%BC%E3%82%AF
基礎知識2) ダッシュとは何か
• これではない (らしい)
A’
• ダッシュとはこういうやつ (らしい)
—
これは「プライム」というのが正解らしい…
ダッシュって何に使う記号?
• ダッシュ (emダッシュ)
文と文の間、字句と字句の間に用いられて、時間の経過を表す
単語の後に用いられて省略を表す
用例)
もう——だめだ。
たとえデスマーチになろうと ——
ダッシュ(enダッシュ) /ハイフン/マイナスの違い
• 1 – 5 (ダッシュ) 1 から 5
• 1 – 5 (ハイフン) 1 の 5
• 1 – 5 (マイナス) 1 ひく 5
わけがわからん(汗
http://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5
_(%E8%A8%98%E5%8F%B7)
Shift JIS (CP932) 時代
• 全角チルダはない。
• あったのは波ダッシュ。
• なので、全角/半角変換の際は、
~ (半角チルダ) は ~ (波ダッシュ) と交換してた ???
Unicode になってから
~ 〜
全角チルダ
( Yu Gothic )
波ダッシュ
( Arial Unicode MS )
なんで?
• Unicode の例示字形を載せる際に間違えたらしい(汗
• Windows XP 以前の 波ダッシュ(U+301C) はこの字形。
• よって、波ダッシュを使用すると、今まで使っていた字形と違うもの
が表示されることになってしまう。
しかし規格書の字形例示は、今なお変更なし?
http://www.unicode.org/charts/PDF/U3000.pdf
規格はそうだが…
でも、さすがに
「〜」
は嫌ですよね?
対策?
じゃあ波ダッシュ「〜」じゃなくて、全角チルダ「~」のほうを
使えばいいんじゃね?
↓
いいことに気が付いた! ウハwww 俺天才wwwww
かくて Windows では 波ダッシュ が U+FF5C (=全角チルダ) に…
状況を予想するに、字形は Unicode 仕様書に準拠する以上変更ができないのに対して、
・Shift JIS の 波ダッシュ を Unicode の何に対応させるかとか、
・”~” の字形に相当する記号を MS-IME で何を候補として出すのかは、
規格があるわけではないので、”~”を 全角チルダに充てるのが一番ストレスがなかった、ってことではないかと…
かくてこういう関係が成り立つ
Windows の場合
ASCII UTFSJIS
半角チルダ
(0x7E)
全角チルダ
(U+FF5E)
波ダッシュ
(0x8160)
半角 - SJIS全角 変換
半角 - UTF全角 変換
波ダッシュ
(U+301C)
使わない
SJIS全角 - UTF全角
変換
でも本来的にはこうだよね
半角チルダ
(0x7E)
全角チルダ
(U+FF5E)
波ダッシュ
(0x8160)
SJIS全角 - UTF全角
変換
半角 - UTF全角 変換
波ダッシュ
(U+301C)
波ダッシュ同士が
対応するべき
必要?(汗
ASCII UTFSJIS
SJIS全角 - UTF全角
変換
半角 - SJIS全角 変換
• 処理系によって、変換方法が違う(汗
現実はこう
Windows (CP932)
の MAP 方法
Macとか? (ShiftJIS)
の MAP 方法
UTFSJIS
波ダッシュ
(0x8160)
波ダッシュ
(U+301C)
全角チルダ
(U+FF5E)
何が起こるか?
• データベースのキャラクターが Shift JIS
• フロントエンド(Webページとか) は UTF
• Windows で入力した「~」はデータベースにどう記録されるのか?
• iPad で入力した「~」はデータベースにどう記録されるのか?
• 記録した文字を読みだして、それぞれの OS で表示させるとどうなる
のか?
まとめ
• Unicode の例示字形が間違ったのが混乱の源。
• 波ダッシュを全角チルダに充てたことが罪。
• そもそも、なぜ ShiftJIS 時代になかった全角文字が存在するのか…
• いまだに全角文字が使用されること自体も罪。
• 半角カナは今すぐ消えるべき。
文字コードの変換は闇。
ところで
全角チルダのコードですが、
U+FF5E
って、やけに後ろのほうだと思いません?
こういうわけです。
半角形/全角形
• 互換用の領域。
• 互換文字とは、既存の文字コードとの互換性と往復変換のためだけに
収録された文字
• ユニコードコンソーシアムは、互換文字は使わないことを推奨
つまり、この領域の文字は使わないほうがよいです。
(極力使わないでください)
ご清聴ありがとうございました
余談
• LT後に質問などで答えたことをまとめておきます。
縦書きの例示字形を 90° 回転させたから。
余談1) なぜ波ダッシュの例示字形を間違ったか?
〜
〜
ちなみに縦/横 変換はいろいろなパターンがあるのです…
変換なし … 一般の文字
左下⇔右上移動 … 句点/読点
90°回転 … 括弧、鍵括弧
多分、波ダッシュは例外ケース。
http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3
%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C
余談2) ダッシュは日本語?
• ダッシュ記号は、一般句読点(General Punctuation)と呼ばれる
U+2000~U+206F の領域にあります。
• 日本語のグループではありません。
• ちなみに ”横の線” な記号は、たとえば以下のものがあります。
(以下がすべてではない)
- U+002D Hyphen-Minus
‐ U+2010 Hyphen
- U+2011 Non-Breaking Hyphen
‐ U+2012 Figure Dash
– U+2013 En Dash
— U+2014 Em Dash
― U+2015 Horizontal Bar
ー U+30FC Katakana-Hiragana Prolonged Sound Mark (長音記号)
─ U+2500 Box Drawings Light Horizontal (罫線)
━ U+2501 Box Drawings Heavy Horizontal (罫線)
一 U+4E00 いち (漢数字)
余談3) 長音記号はいつから使われ始めたか?
• わかりません(汗
• 歴史的かなづかいでは使われてないよね?
• 多分明治から。
http://ja.wikipedia.org/wiki/%E9%95%B7%E9%9F%B3%E7%AC%A6#.E9.95.B7.E9.9F.B3.E7
.AC.A6.E3.81.AE.E6.AD.B4.E5.8F.B2
• 調べたところによると、初出は新井白石らしい。
http://www.shochian.com/cho‘onpu.htm
余談4) ¥記号とか
• この手の問題は、波ダッシュやダッシュに限らず、その他にもいろい
ろ出てきます。注意しましょう。
• ¥ 記号も同様です。
• 特に ¥ 記号は暗黙に変換されたりする場合があるので気を付けま
しょう。
¥ U+005C Reverse Solidus (Backslash)
¥ U+00A5 Yen Sign
¥ U+FFE5 Fullwidth Yen Sign

Más contenido relacionado

La actualidad más candente

ドメインモデルの育て方
ドメインモデルの育て方ドメインモデルの育て方
ドメインモデルの育て方増田 亨
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用nagise
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう増田 亨
 
徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティHiroshi Tokumaru
 
概念モデリング再入門 + DDD
概念モデリング再入門 + DDD概念モデリング再入門 + DDD
概念モデリング再入門 + DDDHiroshima JUG
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する増田 亨
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則増田 亨
 
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう増田 亨
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則bonjin6770 Kurosawa
 
ソフトウェア設計のすすめ
ソフトウェア設計のすすめソフトウェア設計のすすめ
ソフトウェア設計のすすめYoshimura Soichiro
 
OpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクルOpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクルMasaru Kurahayashi
 
広告がうざい
広告がうざい広告がうざい
広告がうざいGen Ito
 
Json型の使い方
Json型の使い方Json型の使い方
Json型の使い方tsudaa
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
ウォーターフォールとアジャイルを考える #ita_ws
ウォーターフォールとアジャイルを考える #ita_wsウォーターフォールとアジャイルを考える #ita_ws
ウォーターフォールとアジャイルを考える #ita_wsYusuke Suzuki
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことBIGLOBE Inc.
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで増田 亨
 
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイルドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル増田 亨
 

La actualidad más candente (20)

ドメインモデルの育て方
ドメインモデルの育て方ドメインモデルの育て方
ドメインモデルの育て方
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
 
徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ
 
概念モデリング再入門 + DDD
概念モデリング再入門 + DDD概念モデリング再入門 + DDD
概念モデリング再入門 + DDD
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
 
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
 
ソフトウェア設計のすすめ
ソフトウェア設計のすすめソフトウェア設計のすすめ
ソフトウェア設計のすすめ
 
OpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクルOpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクル
 
広告がうざい
広告がうざい広告がうざい
広告がうざい
 
Json型の使い方
Json型の使い方Json型の使い方
Json型の使い方
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
ウォーターフォールとアジャイルを考える #ita_ws
ウォーターフォールとアジャイルを考える #ita_wsウォーターフォールとアジャイルを考える #ita_ws
ウォーターフォールとアジャイルを考える #ita_ws
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイルドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
 

Más de tsudaa

ぬぎんくす問題
ぬぎんくす問題ぬぎんくす問題
ぬぎんくす問題tsudaa
 
Windows でも時刻合わせがしたい!
Windows でも時刻合わせがしたい!Windows でも時刻合わせがしたい!
Windows でも時刻合わせがしたい!tsudaa
 
Python と私の事情
Python と私の事情Python と私の事情
Python と私の事情tsudaa
 
真理とは何か
真理とは何か真理とは何か
真理とは何かtsudaa
 
Excelのどうでもよいtipsの紹介
Excelのどうでもよいtipsの紹介Excelのどうでもよいtipsの紹介
Excelのどうでもよいtipsの紹介tsudaa
 
MySQL のユーザー定義変数と RDB のココロ
MySQL のユーザー定義変数と RDB のココロMySQL のユーザー定義変数と RDB のココロ
MySQL のユーザー定義変数と RDB のココロtsudaa
 
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返るHiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返るtsudaa
 
ドメイン名の話 (データベース/SQL)
ドメイン名の話 (データベース/SQL)ドメイン名の話 (データベース/SQL)
ドメイン名の話 (データベース/SQL)tsudaa
 
スターマークの話
スターマークの話スターマークの話
スターマークの話tsudaa
 
Powershell のセキュリティ (大都会ver)
Powershell のセキュリティ (大都会ver)Powershell のセキュリティ (大都会ver)
Powershell のセキュリティ (大都会ver)tsudaa
 
昼の12時は午○何時?
昼の12時は午○何時?昼の12時は午○何時?
昼の12時は午○何時?tsudaa
 
PowerShell 紹介
PowerShell 紹介PowerShell 紹介
PowerShell 紹介tsudaa
 
資格は役に立つか
資格は役に立つか 資格は役に立つか
資格は役に立つか tsudaa
 
○○型言語と呼ばれるために備えるべき最低限の条件についての検討
○○型言語と呼ばれるために備えるべき最低限の条件についての検討○○型言語と呼ばれるために備えるべき最低限の条件についての検討
○○型言語と呼ばれるために備えるべき最低限の条件についての検討tsudaa
 
文字数はおいくら?(Ruby版)
文字数はおいくら?(Ruby版)文字数はおいくら?(Ruby版)
文字数はおいくら?(Ruby版)tsudaa
 
法律の読み方とか
法律の読み方とか法律の読み方とか
法律の読み方とかtsudaa
 
C++入門?
C++入門?C++入門?
C++入門?tsudaa
 

Más de tsudaa (17)

ぬぎんくす問題
ぬぎんくす問題ぬぎんくす問題
ぬぎんくす問題
 
Windows でも時刻合わせがしたい!
Windows でも時刻合わせがしたい!Windows でも時刻合わせがしたい!
Windows でも時刻合わせがしたい!
 
Python と私の事情
Python と私の事情Python と私の事情
Python と私の事情
 
真理とは何か
真理とは何か真理とは何か
真理とは何か
 
Excelのどうでもよいtipsの紹介
Excelのどうでもよいtipsの紹介Excelのどうでもよいtipsの紹介
Excelのどうでもよいtipsの紹介
 
MySQL のユーザー定義変数と RDB のココロ
MySQL のユーザー定義変数と RDB のココロMySQL のユーザー定義変数と RDB のココロ
MySQL のユーザー定義変数と RDB のココロ
 
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返るHiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
 
ドメイン名の話 (データベース/SQL)
ドメイン名の話 (データベース/SQL)ドメイン名の話 (データベース/SQL)
ドメイン名の話 (データベース/SQL)
 
スターマークの話
スターマークの話スターマークの話
スターマークの話
 
Powershell のセキュリティ (大都会ver)
Powershell のセキュリティ (大都会ver)Powershell のセキュリティ (大都会ver)
Powershell のセキュリティ (大都会ver)
 
昼の12時は午○何時?
昼の12時は午○何時?昼の12時は午○何時?
昼の12時は午○何時?
 
PowerShell 紹介
PowerShell 紹介PowerShell 紹介
PowerShell 紹介
 
資格は役に立つか
資格は役に立つか 資格は役に立つか
資格は役に立つか
 
○○型言語と呼ばれるために備えるべき最低限の条件についての検討
○○型言語と呼ばれるために備えるべき最低限の条件についての検討○○型言語と呼ばれるために備えるべき最低限の条件についての検討
○○型言語と呼ばれるために備えるべき最低限の条件についての検討
 
文字数はおいくら?(Ruby版)
文字数はおいくら?(Ruby版)文字数はおいくら?(Ruby版)
文字数はおいくら?(Ruby版)
 
法律の読み方とか
法律の読み方とか法律の読み方とか
法律の読み方とか
 
C++入門?
C++入門?C++入門?
C++入門?
 

全角チルダ問題