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
protojson における文字化けの扱い
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kazu
November 09, 2026
Programming
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
protojson における文字化けの扱い
https://layerx.connpass.com/event/408206/
layerx.go 登壇資料 5分LT
Kazu
November 09, 2026
Other Decks in Programming
See All in Programming
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
360
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
310
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
230
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.4k
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
3
290
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
790
Rails初心者がパスキーを実装してみて大変だったこと
ktombow
0
150
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.6k
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.1k
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
220
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
150
AI Augmentation Techniques with Liberty
ivargrimstad
1
390
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
6.4k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
760
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Claude Code のすすめ
schroneko
67
230k
Navigating Weather and Climate Data
rabernat
0
590
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
The Cult of Friendly URLs
andyhume
79
7.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Transcript
における 文字化けの扱い protojson 勤怠の申請で起きた、1 件の 500 エラーの話 2026/11/09 layerx.go #6
Kazu(@KazuLayerX) / バクラク勤怠
アジェンダ 今日の話 持ち帰ってほしいこと 文字列をバイト数で切ると文字が壊れるが、その場では err も panic も出ない。 壊れた文字列を、JSON 変換や
DB 保存が err にするのか、黙って書き換えるのかを知っておく 1. 前提:バクラク勤怠の構成と申請 2. 起きたこと:本番で 1 件の 500 と、その原因 3. 本題: の文字化けの扱い 4. まとめ protojson © LayerX Inc. 2
自己紹介 自己紹介 Kazu(@KazuLayerX) LayerX で バクラク勤怠 を作っています 2026 年 4
月に新卒で入社 インターンを含めて、LayerX に入社するのは 4 回目 © LayerX Inc. 3
前提 バクラク勤怠の構成:DB に保存する直前で 画面 React protojson を通る 勤怠サービス protojson.Marshal →
MySQL → GraphQL → → BFF(Backend for Go。proto の RPC で受けて DB に保存する直前に JSON 型の列 Frontend) proto の型のまま処理する proto の型を JSON にする Go の中では proto の型のまま持ち回り、JSON になるのは DB に保存する直前だけ © LayerX Inc. 4
前提 バクラク勤怠でできること 打刻:出勤・退勤を記録する 申請:有給や残業などの申請を上長に提出する ← 今日はこれ 出勤簿の確認:自分の勤務状態を見る © LayerX Inc.
5
前提 申請では「種別」と「コメント」を書く 項目 種別 内容 何の申請か(有給・残業・打刻修正など) コメント なぜ申請するか。自由に書ける 最大 400
文字。超えたら後ろを切って ... を付ける 今日の事件は、この コメント で起きた © LayerX Inc. 例 午前休 私用のため午前休を取得 6
アジェンダ 今日の話 1. 前提:バクラク勤怠の構成と申請 2. 起きたこと:本番で 1 件の 500 と、その原因
3. 本題: 4. まとめ © LayerX Inc. protojson の文字化けの扱い 7
起きたこと 本番で 1 件、invalid UTF-8 で 500 が出た 入力されたのは、普通の日本語だった エラーが出たのは、DB
への INSERT の中で呼ばれる protojson.Marshal © LayerX Inc. 8
起きたこと 原因:「400 文字で切る」つもりが、バイトで切っていた 仕様「最大 400 文字。超えたら後ろを切って ... を付ける」の実装(397 + ...
の 3 = 400) も [:n] も、数えているのは文字数ではなくバイト数 日本語は多くの文字が 3 バイト → 文字の途中で切れても、panic も err もない len ※ 影響範囲は調査済みで、影響はごく一部の申請に限られる(修正済み) © LayerX Inc. 9
起きたこと バイトで切ると、日本語 1 文字が途中で切れる 例:コメントの 397 バイト目が「取得」の「得」の 1 バイト目だったとき 元の文字列
"..." を付けた結果 取 E5 8F 96 得 E5 ✂ BE 97 … … 96 E5 2E 2E 2E は「あと 2 バイト続く」の合図なのに、次に 2E ( . )が来た → 正しい UTF-8 ではない文字列(文字化け) ができあがる E5 © LayerX Inc. 10
アジェンダ 今日の話 1. 前提:バクラク勤怠の構成と申請 2. 起きたこと:本番で 1 件の 500 と、その原因
3. 本題: protojson の文字化けの扱い 4. まとめ © LayerX Inc. 11
本題:protojson の文字化けの扱い 文字化けした文字列は、Go の中を素通りした 処理 切る comment[:397] proto の型に詰める 永続化処理に渡す
└ INSERT 中の protojson.Marshal © LayerX Inc. 結果 エラーなし エラーなし エラーなし invalid UTF-8 → 500 中身( fmt の %q で表示) 午前休を取\xe5..." "… 午前休を取\xe5..." "… 午前休を取\xe5..." "… DB には何も保存されない 12
本題:protojson の文字化けの扱い protojson は UTF-8 を確かめてから JSON にする proto3 の
string も JSON も 「UTF-8 であること」が前提 だから protojson は文字化けした文字列を通さない この 500 は、 protojson のおかげで出たエラーだった © LayerX Inc. 13
本題:protojson の文字化けの扱い もし encoding/json だったら、文字化けしたまま DB に保存されていた 午前休を取 E5 ...
渡したもの … DB に保存されるもの … 午前休を取 U+FFFD(置換文字) ... (v1)は 黙って U+FFFD に置き換える。 err == nil 500 にならず、文字化けしたまま画面に表示される。私たちは気づけない encoding/json ※ Go 1.27 から GOEXPERIMENT なしで使える © LayerX Inc. encoding/json/v2 は、既定でエラーにする 14
本題:protojson の文字化けの扱い 補足:MySQL は sql_mode 同じ文字列を VARCHAR に INSERT すると
sql_mode 結果 次第で結果が真逆になる ERROR 1366: Incorrect string value: '\xE5...' strict(本番環境の設定) エラーで止まる。何も保存されない Warning 1366 (エラーではない) strict でない 壊れたバイトから後ろが黙って消える(「…午前休を取」までしか残らない) MySQL 8.0.46 で確認 © LayerX Inc. 15
まとめ まとめ:文字化けしたとき、err を返すのは誰か 文字列をバイト数で切ると文字が壊れるが、その場では err も panic も出ない。 壊れた文字列を、JSON 変換や
DB 保存が err にするのか、黙って書き換えるのかを知っておく err を返さない err を返す comment[:n] encoding/json © LayerX Inc. protojson (v1) encoding/json/v2 直し方 文字数で数える 文字単位で切る 16
ありがとうございました Kazu(@KazuLayerX) / バクラク勤怠 #layerxgo 検証環境:Go 1.26(json/v2 は GOEXPERIMENT=jsonv2 )/
1.27.2、protobuf-go v1.36、MySQL 8.0.46