# Godot import Unicode 2行の原因と表記修正 guard検証用fresh stageのreference/candidate両方で発生した `Unexpected NUL character` 2行は、`tests/performance/test_digest_performance.gd` の2つの `\u0000` リテラルから発生した。両stageの対象スクリプトは同一SHAで、テキストの物理NULと不正UTF-8を走査して0件だった。候補guard変更と独立したimport時診断である。元stageを変更していない。 Godot 4.7.2の独立した小規模fresh projectを3種類作り、それぞれ新importと値のprobeを実行した。実験6プロセスはすべてexit 0。 | 表記 | fresh import のNUL診断 | 2つの値のcodepoint/UTF-8/Variant bytes | |---|---:|---| | 元の `\u0000` リテラル2個 | 2 | 元値 | | 実行時 `String.chr(0)` 2個 | 0 | 元値と完全一致 | | 実行時 `String.chr(0xfffd)` 2個 | 0 | 元値と完全一致 | 元の実行値はNULを内包せず、U+FFFDとなる。日本語と絵文字の値はcodepoints `[21416,25151,65533,127795]`、UTF-8 `e58ea8e688bfefbfbdf09f8cb3`、Variant bytes `040000000d000000e58ea8e688bfefbfbdf09f8cb3000000`。単文字の値はcodepoints `[65533]`、UTF-8 `efbfbd`、Variant bytes `0400000003000000efbfbd00`。これらが3表記で一致した。 Godotのtokenizerはunicode escapeを文字列へ追加する。[4.7.2 tokenizer source](https://raw.githubusercontent.com/godotengine/godot/4.7.2-stable/modules/gdscript/gdscript_tokenizer.cpp) の1006〜1007行が対象。`String::append_utf32(0)` は診断を出してreplacement characterへ置換する。[4.7.2 string source](https://raw.githubusercontent.com/godotengine/godot/4.7.2-stable/core/string/ustring.cpp) の187〜194行が対象。`String::chr()` も同じ追加処理を使う。[4.7.2 string header](https://raw.githubusercontent.com/godotengine/godot/4.7.2-stable/core/string/ustring.h) の411〜414行を確認した。この一次ソースと実験ログが置換の因果根拠である。 root承認に従い、本体テストの2リテラルだけを `String.chr(0xfffd)` で構成する表記へ変更し、理由コメントを付けた。ゲームコードは変更していない。テスト内の実行時 `String.chr(0)` と `PackedByteArray([0,127,255])` の境界試験は維持している。**NUL境界試験を削除してエラー行を隠した変更ではない。** GodotがNULを受け付けず置換する事実を踏まえた表記修正である。 修正後スクリプトSHAは `363772fc43975f12c9e2056e2b01beb4cd8b2d7544db7528f80c6bd127710c1f`。本体で焦点実行した結果は `Digest performance: 83 checks, 0 failures`、exit 0。実行時NUL診断321行は保持した境界試験の63+64+65+129回と一致する。焦点runの前後SHAは同一だった。 証拠は `artifacts/original-completion-2026-10-02/unicode-nul-cause-repro-r01/verification.json` と各import/probe log、fixture copy、`focused-verification.json` と `focused-test.log` に保存した。Godot実行binary SHAは `c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718ccf`。本体fresh importでの2行除去と全回帰の確認はrootが別に担当し、この焦点結果だけから全体受入を主張しない。