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
220
UTF-8 依存の Go コードとは?
BigLT 2019
acomagu
June 29, 2019
Tweet
Share
More Decks by acomagu
See All by acomagu
Stripe SSoT をするべきか否か
acomagu
0
52
JP_Stripes: リコンサイル(突合処理)のテスト
acomagu
0
97
「境界付けられたコンテキスト間の関係」についてもっと語ろう
acomagu
0
94
地方 MaaS 事例: アプリの進化に伴って変化してきた Stripe 利用方法
acomagu
0
320
Stripe リコンサイルの勘所
acomagu
0
490
CDK 一発で全てのエラーログを Slack に流す
acomagu
0
2.2k
AWS CDK を支える Constructs について
acomagu
0
170
DDDとは結局何なのか
acomagu
0
350
API Gateway HTTP API について
acomagu
0
140
Other Decks in Technology
See All in Technology
「Verify with Wallet API」を アプリに導入するために
hinakko
1
240
多様な事業ドメインのクリエイターへ 価値を届けるための営みについて
massyuu
1
300
ZOZOのAI活用実践〜社内基盤からサービス応用まで〜
zozotech
PRO
0
180
stupid jj tricks
indirect
0
8k
Findy Team+のSOC2取得までの道のり
rvirus0817
0
350
神回のメカニズムと再現方法/Mechanisms and Playbook for Kamikai scrumat2025
moriyuya
4
550
How to achieve interoperable digital identity across Asian countries
fujie
0
120
Large Vision Language Modelを用いた 文書画像データ化作業自動化の検証、運用 / shibuya_AI
sansan_randd
0
110
自作LLM Native GORM Pluginで実現する AI Agentバックテスト基盤構築
po3rin
2
260
Goにおける 生成AIによるコード生成の ベンチマーク評価入門
daisuketakeda
2
110
PLaMoの事後学習を支える技術 / PFN LLMセミナー
pfn
PRO
9
3.9k
【Oracle Cloud ウェビナー】クラウド導入に「専用クラウド」という選択肢、Oracle AlloyとOCI Dedicated Region とは
oracle4engineer
PRO
3
110
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
For a Future-Friendly Web
brad_frost
180
9.9k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
RailsConf 2023
tenderlove
30
1.2k
How to train your dragon (web standard)
notwaldorf
96
6.3k
Building Adaptive Systems
keathley
43
2.8k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
9
580
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!