ANTIGRAVITY LABEN
記事一覧/Editor View
Editor View/2026-08-27中級

日本語を含むファイルをエージェントに編集させる前に、バイト列で確かめている3つの検査

エージェントの編集で日本語が1文字だけ入れ替わっても、git の差分は普通の1行変更として通ります。不正な UTF-8・置換文字・正規化ゆれの3つを、1パスの検査にまとめるまでの運用記録です。

antigravity446utf-82japanese4code-review9

プレミアム記事

Antigravity CLI 1.1.21(8月26日)のリリースノートに、非 ASCII を含むファイルで編集が壊れる問題の修正が入っていました。

修正されたのは良いことです。ただ、読んだ瞬間に引っかかったのは別のところでした。もし同じことが手元で起きていたとして、私はそれに気づけただろうか、という点です。

確かめるために、浮世絵の作品名を並べたリソースファイルを模したものを用意して、「神奈川沖浪裏」から1バイトだけを故意に削ってみました。壊れたファイルの差分は、拍子抜けするほど普通に見えました。

個人開発で日本語のリソースを抱えていると、この話は他人事になりません。私自身、日本語の作品名と解説を持つ JSON や、日本語コメントの入ったヘッダファイルを日常的にエージェントへ渡しています。壊れたことに気づく仕組みを、こちら側に一つも置いていませんでした。

git の差分は、壊れたバイトを普通の1行変更として見せます

まず、壊れたときに何が見えるのかを手元で確かめました。正常な UTF-8 のファイルから、3バイト文字の途中の1バイトだけを削ります。

# 「浪」の3バイト目を1バイトだけ削って、不正な UTF-8 を作る
python3 -c "
b = bytearray(open('tracked.txt','rb').read())
i = b.find('浪'.encode())
del b[i+2]
open('tracked.txt','wb').write(bytes(b))"
 
git diff --numstat
git diff | head -8

出力はこうなりました。

1	1	tracked.txt

diff --git a/tracked.txt b/tracked.txt
index 4d2ec8b..50590fb 100644
--- a/tracked.txt
+++ b/tracked.txt
@@ -1,2 +1,2 @@
 // 浮世絵の作品名を保持します
-const title = "神奈川沖浪裏";
+const title = "神奈川沖��裏";

git はバイナリ扱いにしません。警告も出しません。1 insertion(+), 1 deletion(-) という、ごく普通の1行変更です。

ここが厄介な点です。エージェントが 30 ファイルに触った差分を上から順に読んでいるとき、日本語の中の1文字が置換記号になっている行は、視覚的にほとんど引っかかりません。行の長さも構造も変わらないためです。

無人でエージェントを走らせる構成なら、書きかけのファイルが残る問題のほうがまだ気づけます。ファイルが途中で切れていれば、少なくともビルドが落ちます。1文字の置換は落ちません。

壊れ方は3種類あり、検査の当たり方が違います

手元で意図的に壊したファイルを5つ用意して、よく使われる検査コマンドの反応を並べました。

ファイル状態file の判定iconv -f UTF-8 -t UTF-8Python の strict デコード
ok.txt正常な UTF-8UTF-8 textexit 0OK
broken.txt1バイト欠損Non-ISO extended-ASCII textexit 1FAIL(invalid continuation byte)
sjis.txtCP932 で保存OpenPGP Secret Keyexit 1FAIL(invalid start byte)
bom.txtBOM 付き UTF-8UTF-8 (with BOM) textexit 0OK
nfd.txt濁点が分解された NFDUTF-8 textexit 0OK

3点、読み取れることがあります。

  1. file は当てになりません。CP932 で保存された日本語のテキストを、私の環境では「OpenPGP Secret Key」と判定しました。中身は「表示言語を切り替えます」の一行だけです。文字コードの判定にヒューリスティックを使う以上、こういう外し方は起こります。判定結果を条件分岐に使うのは避けることを推奨します。
  2. iconv と Python の strict デコードは一致します。どちらもバイト列としての妥当性を見ているだけなので、当然といえば当然です。手軽さで選んでよい部分です。
  3. BOM と NFD は、どの検査も通ります。 バイト列としては完全に妥当な UTF-8 だからです。壊れているのはバイトではなく、その先の扱いのほうです。

本番のリソースを扱う場面で怖いのは、3つ目です。検査が緑になったという事実だけが残り、壊れていることのほうは誰にも見えません。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
エージェントに日本語ファイルを任せる前に、どの検査をどこへ置けば壊れた編集が本番へ抜けないかを自分で決められるようになる
UTF-8 の妥当性検査だけでは取りこぼす壊れ方を見分け、置換文字が残ったファイルを後から拾い上げられるようになる
リポジトリ全体を1パスで検査する短いスクリプトを、コミット前と CI のどちらへ置くか、実行時間を根拠に判断できるようになる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

Editor View2026-08-14
エージェントの差分を目視で追うのをやめました。2.8.0 の表示上限をきっかけに組み直したレビュー手順
2.8.0 でファイルビューアと履歴差分に表示上限が入りました。全量を目で追う前提が崩れたことをきっかけに、機械が拾える欠陥と人にしか判断できない箇所を分けるレビュー手順へ切り替えた記録です。実際に動くスクリプトと、実リポジトリで見つかった見落としを添えています。
Editor View2026-07-09
Antigravity 2.0 を日本語UI で快適に使うための設定 — 言語パック・コマンドパレット・AI 応答言語の指定
Antigravity 2.0 で UI を日本語化したい時、言語パックのインストールだけでは中途半端な日本語化に止まります。コマンドパレット・設定画面・AI 応答言語の3レイヤーを正しく設定する手順と、英語表記が残る箇所の意図的な使い分け方を、私自身が個人開発の運用で固めた設定ごと共有します。
Editor View2026-04-23
Antigravity で日本語入力(IME)の変換が乱れる・確定できない時の対処ガイド
Antigravity IDE で日本語 IME を使っていると、変換中の文字が消える・確定前にタブ補完に持っていかれる・再変換が効かなくなる等の事故が起きます。macOS・Windows・Linux 別に原因と対処をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →