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
UTF-8 依存の Go コードとは?
Search
acomagu
June 29, 2019
Technology
250
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
UTF-8 依存の Go コードとは?
BigLT 2019
acomagu
June 29, 2019
More Decks by acomagu
See All by acomagu
サーバーレスから Durable Execution へ
acomagu
0
38
Payment Records API を使って地域通貨を Stripe Dashboard に統合してみた
acomagu
0
84
Restate x Stripe: 安心して眠れる決済システムを目指して
acomagu
0
29
Stripe SSoT をするべきか否か
acomagu
0
98
JP_Stripes: リコンサイル(突合処理)のテスト
acomagu
0
140
「境界付けられたコンテキスト間の関係」についてもっと語ろう
acomagu
0
200
地方 MaaS 事例: アプリの進化に伴って変化してきた Stripe 利用方法
acomagu
0
700
Stripe リコンサイルの勘所
acomagu
0
570
CDK 一発で全てのエラーログを Slack に流す
acomagu
0
2.3k
Other Decks in Technology
See All in Technology
Classmethod Company Deck
satoshi7
1
540
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
110
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
510
アウトプット初心者、半年間のふりかえり
4o1sobblue
0
400
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
180
LocalStack を使ったサーバーレスアプリケーション開発 / Serverless Development with LocalStack
kakakakakku
1
450
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
690
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
910
今さら理解するウェブフォントver.2026
takanorip
3
710
ハードウェアコンペでもAI駆動開発が進んでいる話
iotengineer22
1
720
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
4
1.1k
Refining Active Record
shugo
0
140
Featured
See All Featured
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
740
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Are puppies a ranking factor?
jonoalderson
2
4k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
560
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
950
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
620
Transcript
UTF-8依存のGoコードとは 190629 Aizu BigLT @acomagu
今日のゴール - Goの標準の文字コードとは何か? - UTF-8依存のコードとは? - 正しくUTF-8を処理する方法を知る → ドキュメントと実装に差異がないようにしよう
Go標準の文字コードとは?
s に入れるべき文字コードはわかりますか? (ここにある情報のみで)
godoc.org/builtin
godoc.org/builtin
特定の文字コードにしか対応しないなら ドキュメントに書かなければならない!
None
None
でも... UTF-8依存のコードなんて 書いた覚えないけど?
UTF-8依存のコードとは?
UTF-8依存クイズ~!!
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
}
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return string(bts) } []byte -> string
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return string(bts) } []byte -> string 非依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return string(rns) } []rune -> string
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return string(rns) } []rune -> string 依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return []byte(str) } string -> []byte
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return []byte(str) } string -> []byte 非依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return []byte(rns) } []rune -> []byte
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return []byte(rns) } []rune -> []byte 依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return []rune(str) } string -> []rune
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return []rune(str) } string -> []rune 依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return []rune(bts) } []byte -> []rune
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return []rune(bts) } []byte -> []rune 依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return len(str) }
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
return len(str) } 非依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
for i := 0; i < len(str); i++ { _ = str[i] } }
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
for i := 0; i < len(str); i++ { _ = str[i] } } 非依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
for i := range str { _ = str[i] } }
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
for i := range str { _ = str[i] } } 依存
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
bytes.Index([]byte(str1), []byte(str2)) }
UTF-8依存? 非依存? func cast(str string, bts []byte, rns []rune) {
bytes.Index([]byte(str1), []byte(str2)) } 依存
お疲れ様です (ありがとうございます)
まとめ - rune が絡むキャストはUTF-8依存 - string を range にかけるとUTF-8依存 -
しかし len(str) や str[i] は非依存
bytes.Index 問について... Shift-JISだと “表” “\” 0x95 0x5C 0x5C
bytes.Index 問について... Shift-JISだと “表” “\” 0x95 0x5C 0x5C bytes.Index にかけるとまずい...
bytes.Index 問について... 1バイト目 2バイト目以降
bytes.Index 問について... 1バイト目 2バイト目以降 違う → bytes.Index大丈夫
正しくUTF-8を処理するには
① ASCII 依存にしない 例えば: UTF-8 で ”Number” はたくさんある → Unicode
のキャラクタクラスを適切に利用する → コメントに ASCII Number のみと記載する
② 正規化/比較で正しい手順を踏む - 例えば: - Unicode の正規化と比較方法は RFC8264(PRECIS) として 定義されている
- 「いつ使うべきか」も記述がある - golang.org/x/text/secure/precis
③ Grapheme Cluster を意識する Grapheme Cluster とは? → 「1文字の境界」を定義する仕様
③ Grapheme Cluster を意識する Grapheme Cluster とは? → 「1文字の境界」を定義する仕様 「1文字
== 1コードポイント」じゃないの? → Variation Selector が付与されている場合がある
③ Grapheme Cluster を意識する 絵文字とか良くね?
③ Grapheme Cluster を意識する Go では大変... - 標準ライブラリにはない - 外部ライブラリを使用
- Proposal は出てる - 正規表現での対応は不可能そう - \X ...
まとめ - Go の型には UTF-8 依存のものはないが、キャストなどには いくつかある - ASCII 依存
/ PRECIS / Grepheme Cluster を意識する → どこまで対応しているのかドキュメントでしっかり明確にしよ う
Thanks!