Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ソースコードのEUC-JP、全部抜く大作戦 / BuriKaigi2026

Avatar for yukyan yukyan
January 10, 2026
38

ソースコードのEUC-JP、全部抜く大作戦 / BuriKaigi2026

Avatar for yukyan

yukyan

January 10, 2026
Tweet

Transcript

  1. 2 ⾃⼰紹介 EC事業部 事業開発チーム 2022年 新卒⼊社 ⼤浦 優太郎 Oura Yutaro EC事業部でECサイト構築サービス「カラーミー

    ショップ byGMOペパボ」の開発‧運⽤に携わる。 1⽉から事業開発チームに参画。うなぎの浜松出 ⾝。 • X : @yukyan_p • Instagram: @yukyan_p
  2. はじめに 12 • Claude Code で編集した際に⽂字化け • エディタの設定による⽂字化け • GitHub

    でレビューする際に⽂字化け ところどころで、UTF-8 でないことによる開発体験の痛みがある UTF-8 前提のツールによる⽂字化け
  3. EUC-JP を倒すことの難しさ 19 • UTF-8 は Unicode を使えるので111万⽂字ぐらい • PHPがサポートしている

    EUC-JP は下記の⽂字集合の合成 US-ASCII + JIS X0201:1997(半⾓カナ) + JIS X0208:1990 + JIS X0212:1990 ⼤体 1万2千⽂字 UTF-8 -> EUC-JP で失われる情報がある https://www.php.net/manual/ja/mbstring.encodings.php
  4. EUC-JP を倒すことの難しさ 20 • UTF-8 でプログラム上で扱う⽂字列を記述すると、それを EUC-JP として扱おうとしたときに、失われる情報が出てくる (今後、⽂字を追加する場合などに) •

    つまり、EUC-JP は EUC-JP のまま表現して取り扱いたい (EUC-JP に⼤きく依存した今回のケースにおいては) UTF-8 -> EUC-JP で失われる情報がある
  5. 解決策 31 • PHPコードの品質を管理するための静的解析ツール • コードが PSR-12 などの標準ルールやに沿っているかを できる •

    ルールは⾃分で作ることもできる。このルールを「ス ニフ」と呼ぶ PHPCodeSniffer とは
  6. 解決策 33 use PHP_CodeSniffer\Sniffs\Sniff; use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Util\Tokens; /** *

    NonAsciiInCodeSniff * * コード内の非ASCII文字をチェックします(コメントは除外)。 */ class NonAsciiInCodeSniff implements Sniff {
  7. 解決策 34 … // PHPCSのTokens::$commentTokensを使用して、 // すべてのコメント関連トークンをスキップ if (isset($token['code']) &&

    isset(Tokens::$commentTokens[$token['code']])) { continue; } … // 非ASCII文字が含まれていたら警告を出す if ($this->containsNonAscii($token['content'])) { $phpcsFile->addWarning( …
  8. 解決策 35 /** * 文字列に非ASCII文字が含まれているかをチェックします。 * * @param string $content

    チェック対象のコンテンツ * * @return bool */ private function containsNonAscii($content) { // 値がASCII文字の最大値である127 (0x7F) より大きいバイトをチェック return preg_match('/[^\x00-\x7F]/', $content) === 1; }
  9. はじめに 44 • EUC-JP を安全にソースコードから抜く⼿法を提⽰した ◦ ⼀⽅で課題もある • この⼿法は「EUC-JPをEUC-JPのまま取り扱いたい」場合の解決策 の⼀つとなる

    • PHPCodeSniffer を使うことで、マルチバイト⽂字列リテラルが ソースコードにないことを保証する仕組みを作れる • よりいい⽅法を模索していきたいので、情報お待ちしています! まとめ