本文へスキップ
NextCode.ltd
開発風景

「ポ」の1文字で、ビルドが必ず落ちる

「ポ」の1文字で、ビルドが必ず落ちる

画面では7文字。ファイルシステムの中では8文字。その1文字の差で、ビルドが毎回止まる。

このサイトのソースは、Macの Documents/ポートフォリオ というフォルダに入っています。日本人が日本語でフォルダ名を付けた。それだけのことで、手元の next build は一度も成功したことがありません。

コードは関係ない。フォルダの名前です。

1出ていたエラー

ビルドを走らせると、APIのルートを1本書き出すところで毎回こう言って止まります。

ここがポイント

byte index 15 is not a char boundary; it is inside '\u{309a}' (bytes 13..16) of Documents_ポートフォリオ__next-internal_server_app_api_favicon_route_actions_620addbf

— next build のログ(turbopack-core/src/ident.rs:352)

最初に見たときは、自分の書いたどこかに変な文字が混ざったのだと思いました。変更を全部退避して、素の状態で同じページを開いても落ちる。そこで初めて、コードではないと分かりました。

27文字に見えて、8文字ある

エラーに出てくる \u{309a} は半濁点です。「ポ」の丸の部分だけ。

macOSはファイル名を保存するとき、濁点や半濁点の付いた文字を「元の文字+点」に分けて持つことがあります。NFDと呼ばれる形です。実際にこのフォルダ名を1文字ずつ数えると、こうなりました。

フォルダ名「ポートフォリオ」の中身(2026-09-23 実測)

見た目実際の中身
文字数7文字8文字
先頭ポホ(U+30DB)+ ゜(U+309A)
バイト数(UTF-8)21バイトのはず24バイト
NFCに直した名前と同じか同じに見える別の文字列

Turbopackは、ルートごとに Documents_ポートフォリオ__… という長い識別子を作って、それを決まったバイト数で切り詰めています。Documents_ が10バイト、「ホ」が10〜13バイト目、半濁点が13〜16バイト目。そこへ「15バイト目で切れ」と言われると、半濁点の真ん中にハサミが入る。Rustは文字の途中で文字列を切ることを許さないので、その場でpanicします。

日本語の文字はUTF-8で3バイトなので、どこで切っても3回に2回は文字の途中です。漢字だけのフォルダ名でも同じことは起きうる。ただ、分解された半濁点が入ると、見た目と中身のずれまで乗ってくるので、原因にたどり着くまでが長くなりました。

3効かなかった回避策

ここから先は、うまくいかなかった順に書きます。

ルート名を変える。 切る位置は識別子の長さで決まるので、同じコードでもルートによって当たり外れがあります。サービス紹介の4ページのうち1本だけが落ちて、残り3本は通った。落ちたページの名前を変えてみたら、今度は27バイト目、「ォ」の途中で落ちました。名前で逃げるのは運試しです。

英字のシンボリックリンクを張る。 ~/nc-portfolio から本物のフォルダへリンクを張って、そちらでビルドする。Next.jsは実際のパスを解決してから動くので、結局「ポ」にたどり着いて同じ所で止まりました。

Turbopackを使わない。 開発サーバーは --webpack を付ければ普通に動きます。ページの確認はこれで足りる。ところが本番用のビルドを --webpack でやると、PDFを作るライブラリの読み込みで別の理由で落ちる。開発では使えて、ビルドでは使えない。

4結局どう逃げているか

英字だけの名前のフォルダに、ソースを丸ごとコピーしてからビルドしています。scripts/build-mirror.sh という60行ほどのスクリプトで、rsyncで差分だけ写して next build を呼ぶ。node_modules だけはコピーせず本体へのリンクにしたので、233MBを毎回写さずに済んでいます。これで全ページの書き出しまで通りました。

本番はVercelのサーバー上で /vercel/path0 という英字のパスでビルドされるので、最初から何も起きていません。困っているのは手元だけです。

このコピー方式には副作用もありました。9月1日に作業を3本並行で進めたとき、別々のコピー先を指定したつもりが、名前の大文字と小文字しか違わなかった。macOSは既定で大文字小文字を区別しないので、2本が同じフォルダを奪い合い、相手のビルドを消し合っていました。そのせいで、実在しない不具合を2件も観測しています。今はスクリプトにロックを入れて、同じコピー先を2本同時に使えないようにしました。

5正直に言うと

根本の直し方は、たぶん分かっています。フォルダ名をNFC、つまり「ポ」が1文字の形に付け直せばいい。

やっていないのは、このフォルダを前提にしたスクリプトや設定が他のプロジェクトにも散らばっていて、付け直したときに何が壊れるかをまだ洗い出していないからです。1か月近く、コピーで逃げ続けています。

逃げ続けた結果も数えてみました。並行作業のたびに作ったコピーが9個、合わせて4.0GB、ホームフォルダに残っていた。本体のほうは履歴や node_modules まで込みで2.8GBなので、回避策の方が本体より場所を取っている。まずはこれを片づけないといけません。

6まだ分からないこと

フォルダ名をNFCに付け直したら本当に直るのかは、試していないので分かりません。macOSのファイルシステムはNFCとNFDを同じ名前として扱うので、付け直したつもりでも中身がNFDのまま、という可能性すらあります。

もう1つ。日本語のフォルダ名で開発している人はそれなりにいるはずなのに、同じ症状の報告をあまり見かけません。みんな最初から英字で名前を付けているのか、それとも黙ってコピーで逃げているのか。後者なら、ちょっと親近感が湧きます。同じ症状で困っている人がいたら、お問い合わせから聞かせてください。

フォルダ名を付け直す実験をやったら、結果はまた書きます。このサイトを直したほかの記録はブログ一覧にあります。

この記事を書いた人

NextCode(沖縄県宜野湾市)は、iOSアプリ・ホームページ/LP・NFCデジタル名刺・AI業務自動化を作っている開発スタジオです。ここで書いているのは、実際に作って公開したものと、その過程で詰まったことだけです。

お問い合わせフォームは24時間受け付けています。

この記事が役に立ったらシェアしてください