SlideShare une entreprise Scribd logo
1  sur  71
Télécharger pour lire hors ligne
文字化け Powered by Rabbit 2.1.6
文字化け
とみたまさひろ
NSEG#67
2015-09-12
文字化け Powered by Rabbit 2.1.6
自己紹介
とみた まさひろ
http://tmtms.hatenablog.com
http://twitter.com/tmtms
https://github.com/tmtm
長野県北部在住プログラマー
C(1989〜), MySQL(1997〜), Ruby(1998〜)
文字化け Powered by Rabbit 2.1.6
Software Design 9月号に記事書きました
文字化け Powered by Rabbit 2.1.6
文字化け
文字化け Powered by Rabbit 2.1.6
文字化けに関するトラブルシューティング
http://www.geocities.co.jp/Playtown/7711/gallaly/trableshooting.html
文字化け Powered by Rabbit 2.1.6
文字化けを直してみた
残念ながら現バージョンのWindowsでは
文字化けをなおすことは出来ません。
2025年発売予定のWindowsでは対応します。
このトラブルシューティングでは、
このような問題の原因を突き止め、
問題を解決する手順を示します。
質問の答えをクリックしてください。
手順に従って進みながら問題を解決できます。
どうしますか?
□ 仕方がないから「ダイアログで遊ぼう」を閲覧。
□ 「渡部シンイチのDejavu WORLD」を閲覧。
文字化け Powered by Rabbit 2.1.6
文字化けの原因
1. 文字コードが正しくない
文字化け Powered by Rabbit 2.1.6
文字コード
Charset, 文字集合
エンコーディング方式
シフトJIS, 日本語EUC, UTF-8 等
文字のバイト表現
文字化け Powered by Rabbit 2.1.6
日本語の文字コード
UTF-8 (Unicode 今は普通はこれ)
SHIFT_JIS (Windows)
EUC-JP (昔の UNIX)
ISO-2022-JP (メール)
文字化け Powered by Rabbit 2.1.6
同じ文字でも異なるコード
「あ」
UTF-8 (E3 81 82)
EUC-JP (A4 A2)
SHIFT_JIS (82 A0)
文字化け Powered by Rabbit 2.1.6
同じバイト列でも別の文字
C2 A9
UTF-8 「©」
EUC-JP 「息」
SHIFT_JIS 「ツゥ」
文字化け Powered by Rabbit 2.1.6
バイト列だけでは
文字コードはわからない
文字化け Powered by Rabbit 2.1.6
ところで
日本語文字のことを「2バイト文字」と言ってま
せんか?
UTF-8は日本語はだいたい3バイト
「あ」(E3 81 82)
「ア」(EF BD B1)
文字化け Powered by Rabbit 2.1.6
文字化けした文字列の
元の文字コードの見分け方
文字化け Powered by Rabbit 2.1.6
慣れるとパッと見でわかる
文字化け Powered by Rabbit 2.1.6
EUC-JP を SHIFT_JIS として表示
半角カナが多い
日本語にほんごニホンゴ
ニ?ワク?ヒ、ロ、?エ・ヒ・ロ・?エ
文字化け Powered by Rabbit 2.1.6
UTF-8 を SHIFT_JIS として表示
画数の多い漢字の中に半角カナが少々混じってる
日本語にほんごニホンゴ
譌・譛ャ隱槭↓縺サ繧薙#繝九?繝ウ繧エ
文字化け Powered by Rabbit 2.1.6
ISO-2022-JP の ESC 落ち
ASCII文字だけで構成されて「$B」「(B」がある
日本語にほんごニホンゴ
?$BF|K8l$K$[$s$4%K%[%s%4?(B
文字化け Powered by Rabbit 2.1.6
文字化けの原因
2. 文字コードが不明
文字化け Powered by Rabbit 2.1.6
自動判定もできるけど
完全じゃない
文字化け Powered by Rabbit 2.1.6
同じバイト列でも別の文字(再掲)
C2 A9
UTF-8 「©」
EUC-JP 「息」
SHIFT_JIS 「ツゥ」
文字化け Powered by Rabbit 2.1.6
自動判定
バイト列が文字コードの正当な範囲にあるか
どうかで判定
文字列が短いと難しい
文字列が長ければ精度は上がる
へんなバイトが混在してたらアウト
日本語じゃないのに日本語と誤判定したり
文字化け Powered by Rabbit 2.1.6
EUC - Extended Unix Code
EUC-JP : 日本語EUC
EUC-KR : 韓国語EUC
EUC-CN : 簡体字中国語EUC
文字コードの範囲は同じだけど文字が違う
BB FA : 字(JP) / 샙(KR) / 机(CN)
文字化け Powered by Rabbit 2.1.6
文字境界
EUC
1バイト文字 (00-7F) ← ASCII
2バイト文字 (A1-F4 | A1-FE)
文字列の先頭から見ないとわからない
SHIFT_JIS
1バイト文字 (00-7F A1-DF) ← JISX0201
2バイト文字 (81-9F E0-FC | 40-7E 80-FC)
2バイト目に ASCII 範囲含んでてやばい
文字化け Powered by Rabbit 2.1.6
文字境界
UTF-8
1バイト文字 (00-7F) ← ASCII
2バイト文字 (C2-DF | 80-BF)
3バイト文字 (E0-EF | 80-BF | 80-BF)
4バイト文字 (F0-F7 | 80-BF | 80-BF | 80-BF)
文字境界判別しやすい
文字化け Powered by Rabbit 2.1.6
文字化けの原因
3. 機種依存文字
文字化け Powered by Rabbit 2.1.6
ISO-2022-JP
いわゆる「JISコード」
日本語メールで使われる文字コードは未だ
に ISO-2022-JP が主流
 と ¥ を使い分けできる
ISO-2022-JP に無い文字
① ② ③ Ⅰ Ⅱ Ⅲ ㈱ ㎏ ㎝ 髙 﨑 カタカナ
文字化け Powered by Rabbit 2.1.6
ISO-2022-JP に無い文字を
ISO-2022-JP と偽ってメールする
奴がいる
文字化け Powered by Rabbit 2.1.6
文字化け
文字化け Powered by Rabbit 2.1.6
昔の Mac だと ① が ㈪ に見えたり
文字化け Powered by Rabbit 2.1.6
だいたいマイクロソフトが悪い
文字化け Powered by Rabbit 2.1.6
MS の ISO-2022-JP
CP50221
ISO-2022-JP に無い文字を含む
① ② ③ Ⅰ Ⅱ Ⅲ ㈱ ㎏ ㎝ 髙 﨑 カタカナ
 と ¥ の区別がつかない
文字化け Powered by Rabbit 2.1.6
まともなメールアプリが
「ISO-2022-JP」を信じると文字
化け
文字化け Powered by Rabbit 2.1.6
まともなメールアプリが責められる
「Outlookだと見えるのに」
文字化け Powered by Rabbit 2.1.6
ISO-2022-JP は CP50221 と
みなして表示
文字化け Powered by Rabbit 2.1.6
ISO-2022-JP を ISO-2022-JP
として扱うアプリが絶滅
文字化け Powered by Rabbit 2.1.6
文字コードの置き換え
ISO-2022-JP : CP50221
EUC-JP : CP51932
SHIFT_JIS : CP932
文字化け Powered by Rabbit 2.1.6
だいたいマイクロソフトが悪い
文字化け Powered by Rabbit 2.1.6
文字化けの原因
4. フォントが無い
文字化け Powered by Rabbit 2.1.6
🍣 🍺 🍮 🍢 🍜 🍶
文字化け Powered by Rabbit 2.1.6
□ □ □ □ □ □
文字化け Powered by Rabbit 2.1.6
対応フォント入れれば解決
文字化け Powered by Rabbit 2.1.6
Ruby
文字化け Powered by Rabbit 2.1.6
Ruby
プログラミング言語
オブジェクト指向スクリプト言語
オブジェクト毎に異なる文字コードが可能
ファイル毎に異なる文字コードが可能
嫌な予感…
文字化け Powered by Rabbit 2.1.6
ファイル
同じファイルからの読み込みでも異なる文字コード
になることも
f = File.open("何か.txt", "r:utf-8")
f.gets #=> 1行文字列 UTF-8
f.read(10) #=> 10バイトデータ ASCII-8BIT
文字化け Powered by Rabbit 2.1.6
異なる文字コード同士
utf8 = "ほげ"
sjis = "ほげ".encode("cp932")
utf8 == sjis #=> 偽
utf8 + sjis #=> エラー
utf8 =~ /#{sjis}/ #=> エラー
utf8 = "ASCII"
sjis = "ASCII".encode("cp932")
utf8 == sjis #=> 真
文字化け Powered by Rabbit 2.1.6
混ぜるな危険!
文字化け Powered by Rabbit 2.1.6
全部 UTF-8 に統一すれば安全
文字化け Powered by Rabbit 2.1.6
MySQL
文字化け Powered by Rabbit 2.1.6
オープンソースの RDBMS
文字化け Powered by Rabbit 2.1.6
文字コード
クライアントライブラリ
クライアント-サーバー接続
データベース
テーブル
カラム
…毎に設定可能
文字化け Powered by Rabbit 2.1.6
嫌な予感…
文字化け Powered by Rabbit 2.1.6
utf8 と utf8mb4
UTF-8 文字コード
utf8 は 3バイトまで
utf8mb4 は 4バイトまで
絵文字(🍣や🍺)は4バイト
文字化け Powered by Rabbit 2.1.6
utf8カラムに4バイト文字を入れようとすると
接続が utf8 の場合:
mysql> insert into t (c) values ('今日は🍣と🍺');
Query OK, 1 row affected, 1 warning (0.09 sec)
mysql> select * from t;
+-----------+
| c |
+-----------+
| 今日は |
+-----------+
文字化け Powered by Rabbit 2.1.6
utf8カラムに4バイト文字を入れようとすると
接続が utf8mb4 の場合:
mysql> insert into t (c) values ('今日は🍣と🍺');
Query OK, 1 row affected, 1 warning (0.09 sec)
mysql> select * from t;
+----------------+
| c |
+----------------+
| 今日は?と? |
+----------------+
文字化け Powered by Rabbit 2.1.6
utf8mb4カラムに4バイト文字を入れようとすると
接続が utf8mb4 の場合:
mysql> insert into t (c) values ('今日は🍣と🍺');
Query OK, 1 row affected (0.06 sec)
mysql> select * from t;
+----------------------+
| c |
+----------------------+
| 今日は🍣と🍺 |
+----------------------+
文字化け Powered by Rabbit 2.1.6
utf8mb4カラムに4バイト文字を入れようとすると
接続が utf8 の場合:
mysql> insert into t (c) values ('今日は🍣と🍺');
Query OK, 1 row affected, 1 warning (0.06 sec)
mysql> select * from t;
+--------------------+
| c |
+--------------------+
| 今日は????と???? |
+--------------------+
文字化け Powered by Rabbit 2.1.6
4バイト文字を utf8 接続から取り出すと
mysql> select * from t;
+----------------+
| c |
+----------------+
| 今日は?と? |
+----------------+
文字化け Powered by Rabbit 2.1.6
「?」の調査
mysql> select hex(c) from t;
+------------------------------------------+
| hex(c) |
+------------------------------------------+
| E4BB8AE697A5E381AFF09F8DA3E381A8F09F8DBA | ←ちゃんと入ってる
| E4BB8AE697A5E381AF3F3F3F3FE381A83F3F3F3F | ←データが「?」
+------------------------------------------+
文字化け Powered by Rabbit 2.1.6
混ぜるな危険!
文字化け Powered by Rabbit 2.1.6
全部 utf8 / utf8mb4 に統一すれ
ば安全
文字化け Powered by Rabbit 2.1.6
まとめ
文字化け Powered by Rabbit 2.1.6
歴史的経緯により日本語には複数
の文字コードが使用されている
文字化け Powered by Rabbit 2.1.6
これからは UTF-8 を使えばみんな
ハッピー
文字化け Powered by Rabbit 2.1.6
本当に?
文字化け Powered by Rabbit 2.1.6
Unicode の闇
文字化け Powered by Rabbit 2.1.6
中国語と日本語で文字が統一
文字化け Powered by Rabbit 2.1.6
合成文字
が (E3 81 8C)
が (E3 81 8B E3 82 99)
「か」 +「゙」の二文字
比較には正規化が必要
文字化け Powered by Rabbit 2.1.6
色付き絵文字の肌色問題
絵文字は日本発祥
肌色が一種類
「人種差別だ!」
合成文字で解決
これからの絵文字の実装指針、UTR #51“Unicode Emoji”とはなにか -INTERNET Watch
http://internet.watch.impress.co.jp/docs/special/20150131_686161.html
文字化け Powered by Rabbit 2.1.6
俺達の戦いはこれからだ!
文字化け Powered by Rabbit 2.1.6
おわり

Contenu connexe

En vedette

En vedette (12)

Hexoで作るAWS-S3静的サイト
Hexoで作るAWS-S3静的サイトHexoで作るAWS-S3静的サイト
Hexoで作るAWS-S3静的サイト
 
CREについて
CREについてCREについて
CREについて
 
JAWS DAYS 2016 The Next Cloud
JAWS DAYS 2016 The Next CloudJAWS DAYS 2016 The Next Cloud
JAWS DAYS 2016 The Next Cloud
 
AWS認定資格について
AWS認定資格についてAWS認定資格について
AWS認定資格について
 
JAWS DAYS 2015 OpsWorks Aceに聞け
JAWS DAYS 2015 OpsWorks Aceに聞けJAWS DAYS 2015 OpsWorks Aceに聞け
JAWS DAYS 2015 OpsWorks Aceに聞け
 
PHP開発とクラウド
PHP開発とクラウドPHP開発とクラウド
PHP開発とクラウド
 
AWS re:Invent 2016 にコミュニティの人達と行ってきた宇宙一仲の良いレポート 〜 旅を支えてくれたJAWS-UG 〜
AWS re:Invent 2016 にコミュニティの人達と行ってきた宇宙一仲の良いレポート 〜 旅を支えてくれたJAWS-UG 〜AWS re:Invent 2016 にコミュニティの人達と行ってきた宇宙一仲の良いレポート 〜 旅を支えてくれたJAWS-UG 〜
AWS re:Invent 2016 にコミュニティの人達と行ってきた宇宙一仲の良いレポート 〜 旅を支えてくれたJAWS-UG 〜
 
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録
 
JAWSDAYS2017 新訳 とあるアーキテクトのクラウドデザインパターン目録 AMI Maintenance Environment
JAWSDAYS2017 新訳 とあるアーキテクトのクラウドデザインパターン目録 AMI Maintenance EnvironmentJAWSDAYS2017 新訳 とあるアーキテクトのクラウドデザインパターン目録 AMI Maintenance Environment
JAWSDAYS2017 新訳 とあるアーキテクトのクラウドデザインパターン目録 AMI Maintenance Environment
 
jawsdays 2017 新訳-とある設計士の雲設計定石目録_3
jawsdays 2017 新訳-とある設計士の雲設計定石目録_3jawsdays 2017 新訳-とある設計士の雲設計定石目録_3
jawsdays 2017 新訳-とある設計士の雲設計定石目録_3
 
サーバーレスでシステムを開発する時に⼤切な事
サーバーレスでシステムを開発する時に⼤切な事サーバーレスでシステムを開発する時に⼤切な事
サーバーレスでシステムを開発する時に⼤切な事
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから
 

Similaire à 文字化け

Packet と向き合う夏 VRRP Advertisement編
Packet と向き合う夏 VRRP Advertisement編Packet と向き合う夏 VRRP Advertisement編
Packet と向き合う夏 VRRP Advertisement編
@ otsuka752
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
Akihiro Kuwano
 
Web os最新動向20130209
Web os最新動向20130209Web os最新動向20130209
Web os最新動向20130209
Akira Sasaki
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
Yoji Shidara
 

Similaire à 文字化け (20)

本当はこわいエンコーディングの話
本当はこわいエンコーディングの話本当はこわいエンコーディングの話
本当はこわいエンコーディングの話
 
Rails 2.3(もしくはMerb)で5分で作るトランプゲーム(仮)
Rails 2.3(もしくはMerb)で5分で作るトランプゲーム(仮)Rails 2.3(もしくはMerb)で5分で作るトランプゲーム(仮)
Rails 2.3(もしくはMerb)で5分で作るトランプゲーム(仮)
 
Packet と向き合う夏 VRRP Advertisement編
Packet と向き合う夏 VRRP Advertisement編Packet と向き合う夏 VRRP Advertisement編
Packet と向き合う夏 VRRP Advertisement編
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
 
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
 
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
 
Nseg49 mysql
Nseg49 mysqlNseg49 mysql
Nseg49 mysql
 
20210515 cae linux_install_vb
20210515 cae linux_install_vb20210515 cae linux_install_vb
20210515 cae linux_install_vb
 
Web os最新動向20130209
Web os最新動向20130209Web os最新動向20130209
Web os最新動向20130209
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
FM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったFM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作った
 
猫でもできるRailsデプロイ
猫でもできるRailsデプロイ猫でもできるRailsデプロイ
猫でもできるRailsデプロイ
 
Jakarta EE + MicroProfile との付き合い方
Jakarta EE + MicroProfile との付き合い方Jakarta EE + MicroProfile との付き合い方
Jakarta EE + MicroProfile との付き合い方
 
IPv6の現状
IPv6の現状IPv6の現状
IPv6の現状
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
ChatGPT の現状理解と 2023年7月版 LLM情報アップデート
ChatGPT の現状理解と 2023年7月版 LLM情報アップデートChatGPT の現状理解と 2023年7月版 LLM情報アップデート
ChatGPT の現状理解と 2023年7月版 LLM情報アップデート
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
 
Go で Munin プラグインを書いてみた
Go で Munin プラグインを書いてみたGo で Munin プラグインを書いてみた
Go で Munin プラグインを書いてみた
 

Plus de Masahiro Tomita

「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
Masahiro Tomita
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
Masahiro Tomita
 
MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説
Masahiro Tomita
 

Plus de Masahiro Tomita (20)

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろ
 
Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわい
 
CSV
CSVCSV
CSV
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
 
Ruby24
Ruby24Ruby24
Ruby24
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
MySQLを拡張する
MySQLを拡張するMySQLを拡張する
MySQLを拡張する
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
 
MyNAができるまで
MyNAができるまでMyNAができるまで
MyNAができるまで
 
Crystal
CrystalCrystal
Crystal
 
メールの暗号化
メールの暗号化メールの暗号化
メールの暗号化
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
 
🍣=🍺
🍣=🍺🍣=🍺
🍣=🍺
 
Sequelのすすめ
SequelのすすめSequelのすすめ
Sequelのすすめ
 
MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説
 

Dernier

Dernier (10)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/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...
 
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
 
論文紹介: 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
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

文字化け

  • 1. 文字化け Powered by Rabbit 2.1.6 文字化け とみたまさひろ NSEG#67 2015-09-12
  • 2. 文字化け Powered by Rabbit 2.1.6 自己紹介 とみた まさひろ http://tmtms.hatenablog.com http://twitter.com/tmtms https://github.com/tmtm 長野県北部在住プログラマー C(1989〜), MySQL(1997〜), Ruby(1998〜)
  • 3. 文字化け Powered by Rabbit 2.1.6 Software Design 9月号に記事書きました
  • 4. 文字化け Powered by Rabbit 2.1.6 文字化け
  • 5. 文字化け Powered by Rabbit 2.1.6 文字化けに関するトラブルシューティング http://www.geocities.co.jp/Playtown/7711/gallaly/trableshooting.html
  • 6. 文字化け Powered by Rabbit 2.1.6 文字化けを直してみた 残念ながら現バージョンのWindowsでは 文字化けをなおすことは出来ません。 2025年発売予定のWindowsでは対応します。 このトラブルシューティングでは、 このような問題の原因を突き止め、 問題を解決する手順を示します。 質問の答えをクリックしてください。 手順に従って進みながら問題を解決できます。 どうしますか? □ 仕方がないから「ダイアログで遊ぼう」を閲覧。 □ 「渡部シンイチのDejavu WORLD」を閲覧。
  • 7. 文字化け Powered by Rabbit 2.1.6 文字化けの原因 1. 文字コードが正しくない
  • 8. 文字化け Powered by Rabbit 2.1.6 文字コード Charset, 文字集合 エンコーディング方式 シフトJIS, 日本語EUC, UTF-8 等 文字のバイト表現
  • 9. 文字化け Powered by Rabbit 2.1.6 日本語の文字コード UTF-8 (Unicode 今は普通はこれ) SHIFT_JIS (Windows) EUC-JP (昔の UNIX) ISO-2022-JP (メール)
  • 10. 文字化け Powered by Rabbit 2.1.6 同じ文字でも異なるコード 「あ」 UTF-8 (E3 81 82) EUC-JP (A4 A2) SHIFT_JIS (82 A0)
  • 11. 文字化け Powered by Rabbit 2.1.6 同じバイト列でも別の文字 C2 A9 UTF-8 「©」 EUC-JP 「息」 SHIFT_JIS 「ツゥ」
  • 12. 文字化け Powered by Rabbit 2.1.6 バイト列だけでは 文字コードはわからない
  • 13. 文字化け Powered by Rabbit 2.1.6 ところで 日本語文字のことを「2バイト文字」と言ってま せんか? UTF-8は日本語はだいたい3バイト 「あ」(E3 81 82) 「ア」(EF BD B1)
  • 14. 文字化け Powered by Rabbit 2.1.6 文字化けした文字列の 元の文字コードの見分け方
  • 15. 文字化け Powered by Rabbit 2.1.6 慣れるとパッと見でわかる
  • 16. 文字化け Powered by Rabbit 2.1.6 EUC-JP を SHIFT_JIS として表示 半角カナが多い 日本語にほんごニホンゴ ニ?ワク?ヒ、ロ、?エ・ヒ・ロ・?エ
  • 17. 文字化け Powered by Rabbit 2.1.6 UTF-8 を SHIFT_JIS として表示 画数の多い漢字の中に半角カナが少々混じってる 日本語にほんごニホンゴ 譌・譛ャ隱槭↓縺サ繧薙#繝九?繝ウ繧エ
  • 18. 文字化け Powered by Rabbit 2.1.6 ISO-2022-JP の ESC 落ち ASCII文字だけで構成されて「$B」「(B」がある 日本語にほんごニホンゴ ?$BF|K8l$K$[$s$4%K%[%s%4?(B
  • 19. 文字化け Powered by Rabbit 2.1.6 文字化けの原因 2. 文字コードが不明
  • 20. 文字化け Powered by Rabbit 2.1.6 自動判定もできるけど 完全じゃない
  • 21. 文字化け Powered by Rabbit 2.1.6 同じバイト列でも別の文字(再掲) C2 A9 UTF-8 「©」 EUC-JP 「息」 SHIFT_JIS 「ツゥ」
  • 22. 文字化け Powered by Rabbit 2.1.6 自動判定 バイト列が文字コードの正当な範囲にあるか どうかで判定 文字列が短いと難しい 文字列が長ければ精度は上がる へんなバイトが混在してたらアウト 日本語じゃないのに日本語と誤判定したり
  • 23. 文字化け Powered by Rabbit 2.1.6 EUC - Extended Unix Code EUC-JP : 日本語EUC EUC-KR : 韓国語EUC EUC-CN : 簡体字中国語EUC 文字コードの範囲は同じだけど文字が違う BB FA : 字(JP) / 샙(KR) / 机(CN)
  • 24. 文字化け Powered by Rabbit 2.1.6 文字境界 EUC 1バイト文字 (00-7F) ← ASCII 2バイト文字 (A1-F4 | A1-FE) 文字列の先頭から見ないとわからない SHIFT_JIS 1バイト文字 (00-7F A1-DF) ← JISX0201 2バイト文字 (81-9F E0-FC | 40-7E 80-FC) 2バイト目に ASCII 範囲含んでてやばい
  • 25. 文字化け Powered by Rabbit 2.1.6 文字境界 UTF-8 1バイト文字 (00-7F) ← ASCII 2バイト文字 (C2-DF | 80-BF) 3バイト文字 (E0-EF | 80-BF | 80-BF) 4バイト文字 (F0-F7 | 80-BF | 80-BF | 80-BF) 文字境界判別しやすい
  • 26. 文字化け Powered by Rabbit 2.1.6 文字化けの原因 3. 機種依存文字
  • 27. 文字化け Powered by Rabbit 2.1.6 ISO-2022-JP いわゆる「JISコード」 日本語メールで使われる文字コードは未だ に ISO-2022-JP が主流 と ¥ を使い分けできる ISO-2022-JP に無い文字 ① ② ③ Ⅰ Ⅱ Ⅲ ㈱ ㎏ ㎝ 髙 﨑 カタカナ
  • 28. 文字化け Powered by Rabbit 2.1.6 ISO-2022-JP に無い文字を ISO-2022-JP と偽ってメールする 奴がいる
  • 29. 文字化け Powered by Rabbit 2.1.6 文字化け
  • 30. 文字化け Powered by Rabbit 2.1.6 昔の Mac だと ① が ㈪ に見えたり
  • 31. 文字化け Powered by Rabbit 2.1.6 だいたいマイクロソフトが悪い
  • 32. 文字化け Powered by Rabbit 2.1.6 MS の ISO-2022-JP CP50221 ISO-2022-JP に無い文字を含む ① ② ③ Ⅰ Ⅱ Ⅲ ㈱ ㎏ ㎝ 髙 﨑 カタカナ と ¥ の区別がつかない
  • 33. 文字化け Powered by Rabbit 2.1.6 まともなメールアプリが 「ISO-2022-JP」を信じると文字 化け
  • 34. 文字化け Powered by Rabbit 2.1.6 まともなメールアプリが責められる 「Outlookだと見えるのに」
  • 35. 文字化け Powered by Rabbit 2.1.6 ISO-2022-JP は CP50221 と みなして表示
  • 36. 文字化け Powered by Rabbit 2.1.6 ISO-2022-JP を ISO-2022-JP として扱うアプリが絶滅
  • 37. 文字化け Powered by Rabbit 2.1.6 文字コードの置き換え ISO-2022-JP : CP50221 EUC-JP : CP51932 SHIFT_JIS : CP932
  • 38. 文字化け Powered by Rabbit 2.1.6 だいたいマイクロソフトが悪い
  • 39. 文字化け Powered by Rabbit 2.1.6 文字化けの原因 4. フォントが無い
  • 40. 文字化け Powered by Rabbit 2.1.6 🍣 🍺 🍮 🍢 🍜 🍶
  • 41. 文字化け Powered by Rabbit 2.1.6 □ □ □ □ □ □
  • 42. 文字化け Powered by Rabbit 2.1.6 対応フォント入れれば解決
  • 43. 文字化け Powered by Rabbit 2.1.6 Ruby
  • 44. 文字化け Powered by Rabbit 2.1.6 Ruby プログラミング言語 オブジェクト指向スクリプト言語 オブジェクト毎に異なる文字コードが可能 ファイル毎に異なる文字コードが可能 嫌な予感…
  • 45. 文字化け Powered by Rabbit 2.1.6 ファイル 同じファイルからの読み込みでも異なる文字コード になることも f = File.open("何か.txt", "r:utf-8") f.gets #=> 1行文字列 UTF-8 f.read(10) #=> 10バイトデータ ASCII-8BIT
  • 46. 文字化け Powered by Rabbit 2.1.6 異なる文字コード同士 utf8 = "ほげ" sjis = "ほげ".encode("cp932") utf8 == sjis #=> 偽 utf8 + sjis #=> エラー utf8 =~ /#{sjis}/ #=> エラー utf8 = "ASCII" sjis = "ASCII".encode("cp932") utf8 == sjis #=> 真
  • 47. 文字化け Powered by Rabbit 2.1.6 混ぜるな危険!
  • 48. 文字化け Powered by Rabbit 2.1.6 全部 UTF-8 に統一すれば安全
  • 49. 文字化け Powered by Rabbit 2.1.6 MySQL
  • 50. 文字化け Powered by Rabbit 2.1.6 オープンソースの RDBMS
  • 51. 文字化け Powered by Rabbit 2.1.6 文字コード クライアントライブラリ クライアント-サーバー接続 データベース テーブル カラム …毎に設定可能
  • 52. 文字化け Powered by Rabbit 2.1.6 嫌な予感…
  • 53. 文字化け Powered by Rabbit 2.1.6 utf8 と utf8mb4 UTF-8 文字コード utf8 は 3バイトまで utf8mb4 は 4バイトまで 絵文字(🍣や🍺)は4バイト
  • 54. 文字化け Powered by Rabbit 2.1.6 utf8カラムに4バイト文字を入れようとすると 接続が utf8 の場合: mysql> insert into t (c) values ('今日は🍣と🍺'); Query OK, 1 row affected, 1 warning (0.09 sec) mysql> select * from t; +-----------+ | c | +-----------+ | 今日は | +-----------+
  • 55. 文字化け Powered by Rabbit 2.1.6 utf8カラムに4バイト文字を入れようとすると 接続が utf8mb4 の場合: mysql> insert into t (c) values ('今日は🍣と🍺'); Query OK, 1 row affected, 1 warning (0.09 sec) mysql> select * from t; +----------------+ | c | +----------------+ | 今日は?と? | +----------------+
  • 56. 文字化け Powered by Rabbit 2.1.6 utf8mb4カラムに4バイト文字を入れようとすると 接続が utf8mb4 の場合: mysql> insert into t (c) values ('今日は🍣と🍺'); Query OK, 1 row affected (0.06 sec) mysql> select * from t; +----------------------+ | c | +----------------------+ | 今日は🍣と🍺 | +----------------------+
  • 57. 文字化け Powered by Rabbit 2.1.6 utf8mb4カラムに4バイト文字を入れようとすると 接続が utf8 の場合: mysql> insert into t (c) values ('今日は🍣と🍺'); Query OK, 1 row affected, 1 warning (0.06 sec) mysql> select * from t; +--------------------+ | c | +--------------------+ | 今日は????と???? | +--------------------+
  • 58. 文字化け Powered by Rabbit 2.1.6 4バイト文字を utf8 接続から取り出すと mysql> select * from t; +----------------+ | c | +----------------+ | 今日は?と? | +----------------+
  • 59. 文字化け Powered by Rabbit 2.1.6 「?」の調査 mysql> select hex(c) from t; +------------------------------------------+ | hex(c) | +------------------------------------------+ | E4BB8AE697A5E381AFF09F8DA3E381A8F09F8DBA | ←ちゃんと入ってる | E4BB8AE697A5E381AF3F3F3F3FE381A83F3F3F3F | ←データが「?」 +------------------------------------------+
  • 60. 文字化け Powered by Rabbit 2.1.6 混ぜるな危険!
  • 61. 文字化け Powered by Rabbit 2.1.6 全部 utf8 / utf8mb4 に統一すれ ば安全
  • 62. 文字化け Powered by Rabbit 2.1.6 まとめ
  • 63. 文字化け Powered by Rabbit 2.1.6 歴史的経緯により日本語には複数 の文字コードが使用されている
  • 64. 文字化け Powered by Rabbit 2.1.6 これからは UTF-8 を使えばみんな ハッピー
  • 65. 文字化け Powered by Rabbit 2.1.6 本当に?
  • 66. 文字化け Powered by Rabbit 2.1.6 Unicode の闇
  • 67. 文字化け Powered by Rabbit 2.1.6 中国語と日本語で文字が統一
  • 68. 文字化け Powered by Rabbit 2.1.6 合成文字 が (E3 81 8C) が (E3 81 8B E3 82 99) 「か」 +「゙」の二文字 比較には正規化が必要
  • 69. 文字化け Powered by Rabbit 2.1.6 色付き絵文字の肌色問題 絵文字は日本発祥 肌色が一種類 「人種差別だ!」 合成文字で解決 これからの絵文字の実装指針、UTR #51“Unicode Emoji”とはなにか -INTERNET Watch http://internet.watch.impress.co.jp/docs/special/20150131_686161.html
  • 70. 文字化け Powered by Rabbit 2.1.6 俺達の戦いはこれからだ!
  • 71. 文字化け Powered by Rabbit 2.1.6 おわり