Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding...
Search
とみたまさひろ
June 23, 2021
Technology
1.6k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding is hard
とみたまさひろ
June 23, 2021
Transcript
22 slides
MIMEヘッダエンコーディングは MIMEヘッダエンコーディングは 複雑すぎてつらい 複雑すぎてつらい 2021-06-22 とみたまさひろ 1
別にしらなくてもいい 役に立つか立たないかわからない 技術について語るコーナー 2
MIMEヘッダエンコーディング MIMEヘッダエンコーディング メールのヘッダでよく見る =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?= みたいなやつ 3
RFC 2047 RFC 2047 Message Header Extensions for Non-ASCII Text
メールのヘッダは ASCII のみ ASCII以外の文字列をヘッダに書けるようにするために 作られた規格 https://tools.ietf.org/html/rfc2047 4
Bエンコーディング: Qエンコーディング: 「日本語ABC」を変換すると: =?[文字コード]?B?[Base64化されたデータ]?= =?[文字コード]?Q?[そのまま書けない文字を=XXに変換したデータ]?= =?ISO-2022-JP?B?GyRCRnxLXDhsGyhCQUJD?= =?ISO-2022-JP?Q?=1B$BF|K\8l=1B(BABC?= =?UTF-8?B?5pel5pys6KqeQUJD?= =?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9EABC?= 5
エンコードのつらみ エンコードのつらみ 6
Bエンコーディングは基本的には文字列をBase64化して 前後に文字列をつけるだけ 日本語 → 5pel5pys6Kqe → =?UTF-8?B?5pel5pys6Kqe?= つらくない 7
↓ 長い… Subject: MIMEヘッダエンコーディングは複雑すぎてつらい Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ikh+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 8
メールのヘッダだから折り返しちゃえ! ダメ 折り返せるのは空白文字の箇所だけ Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 9
複数のエンコーディング文字列に分割する エンコーディング文字列間の空白は取り除かれる仕様 だからよさそう でも実はこれでもダメ Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?= =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 10
文字を分割しちゃダメ 「複」(E8 A4 87) が分割されてしまっている =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?= → MIMEヘッダエンコーディングは<E8><A4> =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= →
<87>雑すぎてつらい 11
文字単位で処理しないといけない =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+==?= → MIMEヘッダエンコーディングは =?UTF-8?B?6KSH6ZuR44GZ44GO44Gm44Gk44KJ44GE?= → 複雑すぎてつらい 12
さらに ISO-2022-JP のような状態を持つ文字コードの場合は ASCII で終了しないといけない <ESC>$B : JIS X 0208
<ESC>(B : US-ASCII 日本語ABCあいう → <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"$$$&<ESC>(B 13
これは OK <ESC>$BF|K\8l<ESC>(BABC⏎ 日本語ABC <ESC>$B$"$$$&<ESC>(B あいう 14
これはNG <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"⏎ 日本語ABCあ $$$&<ESC>(B いう 15
やるならエンコーディング文字列の最後にASCIIに戻す <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"<ESC>(B⏎ 日本語ABCあ <ESC>$B$$$&<ESC>(B いう 16
デコードのつらみ デコードのつらみ 17
文字が分割されている =?UTF-8?B?44GC44GE44GG44GI44E=?=⏎ あいうえ<E3><81> =?UTF-8?B?iuOBi+OBjeOBj+OBkeOBkw==?= <8A>かきくけこ ↓ あいうえ???かきくけこ 18
エンコーディング文字列がつながってる 本当はデコードしちゃダメ =?UTF-8?B?44GC44GE44GG44GI44GK?==?UTF-8?B?44GL44GN44GP44GR44GT?= 19
「"」で括られている 添付ファイル名とかでよく見る 本当はデコードしちゃダメ "=?UTF-8?B?44GC44GE44GG44GI44GK?=" 20
ISO-2022-JP と書かれてるのに ISO-2022-JP に無い文字が含まれている 「ア」「①」「Ⅲ」「㍻」「髙」など 本当はダメなんだけど普通に使われてる ISO-2022-JP じゃなくて CP50221 として扱う
21
つらい 😇 つらい 😇 22
More Decks by とみたまさひろ
See All by とみたまさひろ
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
2k
文字列の並び順 / Unicode Collation
tmtms
4
1.4k
夢の印税生活 / Life on Royalties
tmtms
0
700
文字列の並び順 / String Collation
tmtms
1
300
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
1.2k
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.7k
Ruby on Browser
tmtms
1
2.5k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2.4k
ショートカットと端末 / shortcut & terminal
tmtms
2
1.1k
Other Decks in Technology
See All in Technology
内製アプリとClaudeスキルのセキュリティチェック、 Backlogの課題で回しています。
ayaka_egaaa
0
170
分析作業をどこまで任せるか自分で決められる AIネイティブBI『Golden Analytics』が 良さげな話 /golden-analytics-is-ai-native-bi
shinyaa31
0
140
これからのデータエンジニアの役割について考える / Rethinking the Role of Data Engineers in the AI Era
okiyuki99
0
390
Ebitengine製iOSアプリ公開ボタンを押す会
eiei114
0
120
81天的 AI Agent 軟體開發團隊治理實務分享
regionbbs
0
150
ゼロから作るWebアプリの新定番!?Amplify Gen 2 × AWS Blocksで実現する「開発速度とRDBの柔軟性のいいとこ取り」
amixedcolor
1
240
Copilot Coworkで「みのるん式」やってみた
minorun365
PRO
2
1.7k
狙われているAPIの脆弱性!今こそ手をつけるべき根本的な対策とは?
nagix
0
110
ライフワーク「猫でもわかるDirectConnect」
kentapapa
0
320
大江戸Ruby会議でデータベース クライアントの話をするのは 間違っているだろうか
yahonda
1
120
属人化したISMS運用をGitHubとAIで仕組み化した1年間の記録
sioncojp
4
2.3k
2026 Apache Flink Community Checkpoint
rmetzger
0
230
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
880
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
1
310
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
520
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
740
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
380
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.7k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k