SNBT(Stringified NBT)は、NBTを人が読める文字列で表したものです。
コマンドの/giveや/dataで使われる記法です。
{Name:"minecraft:oak_stairs",Count:1b,tag:{Damage:0}}
コード例は基準実装のC#で示します。 他の言語での綴りはAPI対応表を参照してください。
// 文字列 -> タグ
NbtTag tag = Snbt.Parse("{a:1b,b:[1,2,3]}");
// タグ -> 文字列
string oneLine = Snbt.Write(tag);
string pretty = Snbt.WritePretty(tag);WritePrettyは改行とインデントを入れます。
Writeは1行に詰めます。どちらも全言語で1バイトも違わない出力になります。
数値はどの型なのかを接尾辞で表します。
| 接尾辞 | 型 | 例 |
|---|---|---|
b / B |
TAG_Byte |
1b |
s / S |
TAG_Short |
1s |
| なし(整数) | TAG_Int |
1 |
l / L |
TAG_Long |
1l |
f / F |
TAG_Float |
1.0f |
d / D / なし(小数) |
TAG_Double |
1.0 |
配列は先頭に型を書きます。
[B;1b,2b] TAG_Byte_Array
[I;1,2,3] TAG_Int_Array
[L;1l,2l] TAG_Long_Array
[1,2,3] TAG_List(要素は TAG_Int)
新しい構文にも対応しています。
0x1F 16進リテラル
0b1010 2進リテラル
1_000_000 桁区切り
.5 先頭の 0 を省いた小数
2e3 指数表記
+5 / -5 符号
true/false bool(TAG_Byte の 1 / 0 になる)
{a:1,} 末尾のカンマ
0xFFbのbは、16進の数字なのかTAG_Byteの印なのか区別できません。
そこで、16進リテラルではs / S / l / Lだけを型の接尾辞として認めます。
b / d / fは数字として読みます(spec/11 2.1)。
2進リテラルの数字は0と1だけなので、どの接尾辞も使えます。
Infinity -Infinity NaN
これらはSNBTで読み書きできますが、Minecraft自身は受け付けないことがあります。 ワールドへ書き込む用途には使わないでください。
全言語で同じ入力から同じ文字列が出るように、次の点を仕様で固定しています。
言語ごとの既定の書式(C#のR、JavaのDouble.toString、JavaScriptのtoStringなど)は微妙に違います。
そこで、元の値へ正確に戻る最短の10進表記を自前で求めています(spec/11 5.1)。
0.1f -> 0.1f (0.10000000149011612f にはしない)
-0.0 -> -0.0d (符号を落とさない)
- 文字列は常に
"で囲む "と\は\"と\\にする\b\t\n\f\rはこの短縮形で書き、それ以外の制御文字は\uXXXXにする- 正しいサロゲートペア(絵文字など)はそのまま出す
- 孤立サロゲートは
\uXXXXでエスケープする
[A-Za-z0-9_.+-]だけからなるキーは引用せず、それ以外は引用します。
対象は、バイナリNBTへ一意に写せる範囲だけです(adr/0006)。
[1, "a", {}]のように型の違う要素が混じったリストは、バイナリNBTのTAG_Listで表せないので受け付けません。パースするとMALFORMED_DATAになります- 文字名によるエスケープ
\N{名前}は、実装間で名前表が揃わないので扱いません。パースするとUNSUPPORTED_FEATUREになります
コマンド用の拡張のうちbool()とuuid()は、バイナリNBTへ写せるので対応しています。
- 01. NBTの読み書き
- 仕様11: SNBT(EBNF文法と正準表記の算法)