Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
UTF-8 依存の Go コードとは?
Search
acomagu
June 29, 2019
Technology
1
210
UTF-8 依存の Go コードとは?
BigLT 2019
acomagu
June 29, 2019
Tweet
Share
More Decks by acomagu
See All by acomagu
Stripe SSoT をするべきか否か
acomagu
0
47
JP_Stripes: リコンサイル(突合処理)のテスト
acomagu
0
83
「境界付けられたコンテキスト間の関係」についてもっと語ろう
acomagu
0
80
地方 MaaS 事例: アプリの進化に伴って変化してきた Stripe 利用方法
acomagu
0
270
Stripe リコンサイルの勘所
acomagu
0
450
CDK 一発で全てのエラーログを Slack に流す
acomagu
0
2.1k
AWS CDK を支える Constructs について
acomagu
0
170
DDDとは結局何なのか
acomagu
0
300
API Gateway HTTP API について
acomagu
0
140
Other Decks in Technology
See All in Technology
製造業からパッケージ製品まで、あらゆる領域をカバー!生成AIを利用したテストシナリオ生成 / 20250627 Suguru Ishii
shift_evolve
PRO
1
140
GeminiとNotebookLMによる金融実務の業務革新
abenben
0
230
データプラットフォーム技術におけるメダリオンアーキテクチャという考え方/DataPlatformWithMedallionArchitecture
smdmts
5
630
_第3回__AIxIoTビジネス共創ラボ紹介資料_20250617.pdf
iotcomjpadmin
0
150
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全 / 20250625-aws-summit-aws-policy
opelab
9
1.1k
生成AIでwebアプリケーションを作ってみた
tajimon
2
150
Yamla: Rustでつくるリアルタイム性を追求した機械学習基盤 / Yamla: A Rust-Based Machine Learning Platform Pursuing Real-Time Capabilities
lycorptech_jp
PRO
3
120
初めてのAzure FunctionsをClaude Codeで作ってみた / My first Azure Functions using Claude Code
hideakiaoyagi
1
220
Абьюзим random_bytes(). Фёдор Кулаков, разработчик Lamoda Tech
lamodatech
0
340
BrainPadプログラミングコンテスト記念LT会2025_社内イベント&問題解説
brainpadpr
1
160
Microsoft Build 2025 技術/製品動向 for Microsoft Startup Tech Community
torumakabe
2
260
強化されたAmazon Location Serviceによる新機能と開発者体験
dayjournal
2
210
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Site-Speed That Sticks
csswizardry
10
660
Music & Morning Musume
bryan
46
6.6k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Thoughts on Productivity
jonyablonski
69
4.7k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
930
Code Review Best Practice
trishagee
68
18k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
17
940
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!