Verse では、"Hello Verse"
や "Epic Games"
などのテキストを格納および処理するための 型 として string
を使用します。Verse では、文字列に文字、数字、句読点、スペース、および絵文字を含めることができます。文字が入っていない文字列 ""
は 空文字列 と呼ばれます。
コード内に、事前定義済みの文字列 値 を文字列 リテラル として含めることができます。文字列リテラルは、コード内で二重引用符 " "
で囲まれた一連の文字です。
次の例は、Hello という名前の文字列 変数 を作成し、文字列リテラル "Hello world"
で 初期化 する方法を示しています。
Hello : string = "Hello world"
文字エンコーディング
文字エンコーディングは、コード ポイント と呼ばれる、コンピュータが理解できるテキスト文字とデータの間のマッピングです。
Verse では、言語、プラットフォーム、およびデバイスの間で文字に関して同等のサポートを提供するために、Unicode Consortium が開発した標準である、UTF-8 Unicode 文字エンコーディング スキームを使用します。
たとえば、この文字列の絵文字 "🐈"
は、絵文字の Unicode コード ポイント "{0u1f408}"
で表すこともできます。 Unicode でサポートされている文字の一覧およびそれらに対応するコード ポイントについては、Unicode のドキュメント を参照してください。
UTF-8 の コード単位 は 8 ビット (1 バイト) であり、1 ~ 4 バイト長のコード ポイントで文字をエンコードします。値の小さいコード ポイントで使用されるバイト数は、値の大きいコード ポイントより少なくなっています。たとえば、"a"
では 1 バイトの "{0o61}"
が使用されますが、"á"
では 2 バイトの "{0oC3}{0oA1}"
が使用されます。
文字列演算
文字列では、結合、比較、インデックス指定、文字列の長さの取得、および文字列 補間 がサポートされています。
結合
結合は、文字列が別の文字列に付加されるときに行われます。演算子 +
を使用して、文字列を結合できます。
たとえば次のコードでは、変数 Announcement
に文字列 "...And the winner is: Player One!"
が入ることになります。
# 勝利したプレイヤーの名前:
WinningPlayerName : string = "Player One"
# 勝者を知らせるメッセージをビルドします。
Announcement : string = "...And the winner is: " + WinningPlayerName + "!"
文字列補間
文字列に現在のスコープで定義された有効な ToString()
関数がある場合は、その文字列に値を挿入できます。
たとえば次のコードでは、変数 Announcement
に文字列 "...And the winner is: Player One!"
が入ることになります。
# 勝利したプレイヤーの名前:
WinningPlayerName : string = "Player One"
# 勝者を知らせるメッセージをビルドします。
Announcement : string = "...And the winner is: {WinningPlayerName}!"
比較
2 つの文字列が等しいかどうかは、それらが同じ文字を使用しているかどうかによって決まります。
Verse での文字列の比較は、各文字のコード ポイントを比較することによって行われます。 大文字と小文字のコード ポイントは異なるため、2 つの文字列の比較では大文字と小文字が区別されます。
失敗する可能性がある演算子 =
を使用して 2 つの文字列が等しいかどうかをテストでき、失敗する可能性がある演算子 <>
を使用して等しくないことをテストできます。
Unicode では、同じ文字を表す方法が複数あります。たとえば "é"
は "{0u0049}"
ですが、2 つのコード ポイント "{0u0065}"
("e"
) と "{0u0301}"
(組み合わせるアクセント) を使用することもできます。そのため、どちらも文字 "é"
のように見えるものの、文字列で別のコード ポイントが使用されているこれらの文字列を比較すると、文字列は等しくなりません。つまり、"{0u0049}"
は "{0u0065}{0u0301}"
と同じではありません。
次の例では、プレイヤーが正しいアイテムを使用してアドベンチャー / パズル ゲームを進めたかどうかを確認します。
# これは、パズルで次のステップをアンロックするのに必要なアイテムです。
ExpectedItemInternalName : string = "RedPotion"
# これは、プレイヤーが選択したアイテムです。
SelectedItemInternalName : string = "BluePotion"
# プレイヤーが正しいアイテムを選択しているかどうかをチェックします。
if (SelectedItemInternalName = ExpectedItemInternalName):
# 同じであれば、 パズルの次にステップに進むことができることを報告します。
return true
# 同じでなければ、このアイテムではパズルの次のステップに進むことができないことを報告します。
return false
長さ
文字列のメンバー Length
にアクセスすることによって、文字列内の UTF-8 コード単位の数を取得できます。たとえば、"hey".Length
は 3 です。
文字列の長さは、文字列を UTF-8 コード単位で表すのに必要なデータの量に相当します。たとえば "héy".Length
は 4 ですが、その理由は、この文字列は 3 文字であるように見えるものの、文字 é
を表すには追加の UTF-8 コード単位が必要であるためです。次のコードは「秒」のタイマーを 2 桁で表示しており、必要に応じて、その表示の先頭に 0 がパディングされます。
# SecondsRemaining は負の値ではないことが想定されています。
SecondsRemaining : int = 30
# その整数表現を文字列に自動的に変換します。
SecondsString:string = SecondsRemaining
# タイマーの表示文字列を設定します。
var Combined : string = "Time Remaining: "
# 文字列が長すぎる場合は、それを 2 桁の最大値「99」に置き換えます。
if (SecondsString.Length > 2):
# クロックの時間が大きすぎます。文字列をハードコード化されている最大値に設定します。
set Combined += "99"
else if (SecondsString.Length < 2):
# 表示に先頭のゼロをパディングします。
set Combined += "0{SecondsString}"
else:
# 文字列はすでにちょうどの長さであるため、それを加えます。
set Combined += SecondsString
インデックス
特定の文字列のインデックスで UTF-8 コード単位にアクセスできます。 文字列の最初の UTF-8 コード単位のインデックスは 0 であり、それに続く各コード単位のインデックスは数が増えていきます。
たとえば "cat"[0]
は "c"
であり、"cat"[1]
は "a"
です。
インデックス | 0 | 1 | 2 |
文字 | "c" |
"a" |
"t" |
コード単位 | "{0o63}" |
"{0o61}" |
"{0o74}" |
文字列に 2 つ以上のコード単位で表される文字が含まれている場合は、各コード単位にインデックスが付けられます。たとえば、"á"
は 2 つの UTF-8 コード単位 "{0oC3}{0oA1}"
で表されるため、"cát"[1]
は "{0oC3}"
であり、"cát"[2]
は "{0oA1}"
です。
インデックス | 0 | 1 | 2 | 3 |
文字 | "c" |
"á" |
"t" |
|
コード単位 | "{0o63}" |
"{0oC3}" |
"{0oA1}" |
"{0o74}" |
文字列の最後のインデックスは、文字列の長さより 1 小さくなります。たとえば、"cat".Length
は 3 であり、"cat"
の "t"
のインデックスは 2 です。
標準ライブラリ
標準ライブラリ には、文字列の作成と使用に役立つ関数が用意されています。これらの関数の詳細については、「Verse API リファレンス」を参照してください。
文字の代替表現
一部の文字には、文字列で使用される場合の代替表現があります。たとえば、"{}"
は 文字列補間 または文字のコード ポイントに使用できますが、テキスト内で中かっこ文字「{}」自体として使用することもできます。
文字列内で文字の代替表現を使用できるようにするには、文字列内で文字の前に エスケープ文字 "\"
を付加する必要があります。たとえば、"\{\}"
ではテキスト内で「{}」としてレンダリングされ、"\n"
ではテキスト内で新しい行が開始されます。
実装の詳細
string
型は、UTF-8 コード単位の 配列 である []char
の 型エイリアス です。文字列は配列の型エイリアスであるため、文字列の動作は配列と同じです。
文字には、サイズとコード ポイントの形式に応じて char
と char32
という 2 つの プリミティブ型 があります。Verse では、char
と char32
の機能は、比較およびそれぞれの値にアクセスするためだけに用意されています。
プリミティブ型 | 説明 | サポートされている形式 |
---|---|---|
char | 値が 256 (0off ) までの単一の UTF-8 コード単位 (1 バイト) を表すプリミティブ型です。 |
形式 0oXX のコード単位。例:0o52 。 |
char32 | Unicode コード ポイントを表すプリミティブ型です。 | 形式 0uXXXX のコード ポイント。例:0u0041 。 |
また、一重引用符でリテラルを表現することもできます。一重引用符内の文字列のプリミティブ型が char
と char32
のどちらであるかは、その文字に使用される UTF-8 コード単位によって決まります。たとえば、'e'
は char
であり、'é'
は char32
です。
持続可能型
文字列、char、および char32 の値はすべて持続可能な値であるため、モジュールスコープの weak_map
変数で使用すると、ゲーム セッション間でその値を持続できます。Verse での持続性の詳細については、「Verse で持続可能データを使用する」を参照してください。