Difference between revisions of "Category:LSL String/ja"

From Second Life Wiki
Jump to navigation Jump to search
(Redirected page to Category:LSL 文字列)
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
#Redirect [[:Category:LSL 文字列]]
{{Multi-lang}}
{{LSL Header/ja|ml=*}}
{{LSLC/ja|}}{{LSLC/ja|Types}}
{{RightToc}}
 
stringはテキストデータです。
 
Stringの値はLSLテキストを定義するときに、ダブルクォーテーション(" ")て囲まれます。
 
文字列には、「NUL」文字を除いて任意の文字を使用できます。ただし、一部の文字はエスケープする必要がある場合があります(詳細についてはこのページの[[#Escape Codes|Escape Codes section]]を参照してください)。 「NUL」文字はUnicode値U+0000であり、LSL文字列に存在できません。したがって、例えばllUnescapeURL("%00")は空の文字列""を結果とします。
 
stringの長さは、利用可能な[[llGetFreeMemory/ja|スクリプトメモリ]]によってのみ制限されます(操作上の制約についてはこのページの[[#String_Length_Restraints|String Length Restraints]]セクションを参照してください)。ただし、Monoでは文字列はUTF-16を使用し、1文字あたり2つのメモリバイトを占有します。
 
stringは、'''+演算子'''を使用して連結(結合)できます。ただし、文字列をグローバル変数として定義する場合、+演算子は実行可能な命令として扱われ、コンパイラによって処理されないことに注意してください。連結は、実行可能なコード内でのみ行うことができます。つまり、ユーザー定義の関数内またはイベント内で行うことができます。
 
一部の文字列操作は、大文字と小文字の変換などの組み込み関数を使用して行うことができます。置換、左端取得、右端取得、テキストの装飾などの他の操作は、他のLSLユーザーによって開発された関数を使用して行う必要があります(これに関する例はこのページの一番下にあります)。
 
文字列の出力がユーザーの画面やメニューに表示される際のフォント、サイズ、太さ、色などについては、制御できません。画面に表示されるテキストの外観(たとえば、テキストからのチャットなど)は、ユーザーによって制御されます(ただし、デフォルトを変更するユーザーはあまり多くありません)。文字が大文字または小文字で表示されるかどうかのみを制御できます。
 
(表示されるテキストの色を制御できる唯一の場合は、[[llSetText/ja|Floating Text]]を使用する場合です。)
 
{|
|
String 例:
<source lang="lsl2">"Hello Avatar!"
"Yes"
"No"
"It's 10 o'clock."
"I am 21 years old!"
"Help " + "me"
EOF
 
//以下の2つのstringは同じ値です。
 
"I scream,\nyou scream,\nwe all scream,\nfor ice-cream!"
"I scream,
you scream,
we all scream,
for ice-cream!"
</source>
|}
 
{{#vardefine:p_name_desc|変数名
}}{{#vardefine:p_value_desc|string 要素もしくは定型値
}}{{#vardefine:p_value_t_desc|要素もしくは定型値
}}
<div id="box">
== 変数: string {{LSL Param|name}}; ==
<div style="padding: 0.5em;">
<source lang="lsl2">string name;</source>
宣言するstring型の変数を'''name'''と名づけて、{{HoverText|""|空のstring}}にします。
{|
{{LSL DefineRow|variable|name|{{#var:p_name_desc}}}}
|}
</div></div>
 
<div id="box">
== 変数: string {{LSL Param|name}} {{=}} {{LSL Param|value}}; ==
<div style="padding: 0.5em;">
<source lang="lsl2">string name = value;</source>
宣言するstring型の変数を'''name'''と名づけて、'''value'''の値をいれます。
{|
{{LSL DefineRow|variable|name|{{#var:p_name_desc}}}}
{{LSL DefineRow|expression|value|{{#var:p_value_desc}}}}
|}
</div></div>
 
<div id="box">
== [[Typecast/ja|型の変換]]: (string){{LSL Param|value_t|value}} ==
<div style="padding: 0.5em;">
<source lang="lsl2">(string)value</source>
'''value'''をstring型の値に変換します。
{|
{{LSL DefineRow|expression|value|{{#var:p_value_t_desc}}}}
|}
</div></div>
 
<div id="box">
 
== [[LSL Operators/ja|演算子]] ==
<div style="padding: 0.5em;">
ほかの情報は[[LSL Operators/ja|演算子]] を参照します。
<div id="box" style="padding-left: 0.5em;padding-right: 0.5em;padding-bottom: 0.5em;">
=== 結合: {{LSL Param|value|value1}} + {{LSL Param|value|value2}} ===
<source lang="lsl2">(value1 + value2)</source>
入力での編集以外で、2つのstringを1つのstringに結合します。'''value2'''に '''value1'''を加えて、結果のstringに返します。
{|
{{LSL DefineRow|expression|value1|{{#var:p_value_desc}}}}
{{LSL DefineRow|expression|value2|{{#var:p_value_desc}}}}
|}
</div>
<div id="box" style="padding-left: 0.5em;padding-right: 0.5em;padding-bottom: 0.5em;">
 
=== 比較: {{LSL Param|value|value1}} <nowiki>==</nowiki> {{LSL Param|value|value2}} ===
<source lang="lsl2">(value1 == value2)</source>
2つのstringを比較して、同じ長さで同じ文字なら1を返し、そうでなければ0を返します。 この演算子はCの<code>!strcmp('''value1''', '''value2''')</code>と極めて似たような働きをし、従ってCやJavaでの == 演算子と直観的に異なる故に、技術的に異なるものです。
{|
{{LSL DefineRow|expression|value1|{{#var:p_value_desc}}}}
{{LSL DefineRow|expression|value2|{{#var:p_value_desc}}}}
|}
</div>
<div id="box" style="padding-left: 0.5em;padding-right: 0.5em;padding-bottom: 0.5em;">
=== 比較: {{LSL Param|value|value1}} != {{LSL Param|value|value2}} ===
<source lang="lsl2">(value1 != value2)</source>
2つのstringを比較し、同じ長さで同じ文字であれば{{HoverText|zero|0}}を返し、そうでなければ0ではないものを返します。 この演算子はCの<code>strcmp('''value1''', '''value2''')</code>と極めて似た働きをし、従ってCやJavaでの != 演算子と直観的に異なる故に、技術的に異なるものです。
{|
{{LSL DefineRow|expression|value1|{{#var:p_value_desc}}}}
{{LSL DefineRow|expression|value2|{{#var:p_value_desc}}}}
|}
</div>
</div></div>
 
<div id="box">
== エスケープコード ==
<div style="padding: 0.5em;">
{|{{Prettytable|style=float:left;}}
|+
|-{{Hl2}}
!Substring
!Replaced with
|-
|| \t || 4スペース
|-
|| \n || 改行
|-
|| \" || ダブルクオーテーション
|-
|| \\ || バックスラッシュ
|}
エスケープコードは、スクリプトがコンパイルされる際に変換されます。実行中には変換されません。コンパイラは、\と文字の他の組み合わせを\を削除して無視します。したがって、"\a"は"a"を意味します。
結果として、スクリプトがコンパイルされる際に含まれる文字列のみが、例えば \n が "改行" 文字に変換されます。ノートカード、チャット、HTTP、オブジェクトの名前や説明などから読み込んだテキストは、エスケープコードをチェックしないため、ノートカードに入力した \n は自動的に "改行" 文字には変換されません。何らかの理由で本当に必要な場合を除いて、自分で変換する必要があります。
 
CやJavaなどの言語からLSLに移行する人々は、最初はLSLの文字列エスケープルールが混乱するかもしれません。LSLでは、"\n"はCやJavaと同様に{{LSLG/ja|llUnescapeURL}}("%0A")を意味しますが、"\t"は{{LSLG/ja|llUnescapeURL}}("%09")ではなく{{LSLG/ja|llUnescapeURL}}("%20%20%20%20")を意味します。さらに、"\r"のエスケープコードは存在せず、"\r"は{{LSLG/ja|llUnescapeURL}}("%0D")ではなく単に "r" に変換されます。
 
エスケープされた文字の実行時の変換については、ユーザー関数[[Unescape]]を試してみてください。
</div></div>
 
<div id="box">
 
==アクセントのある文字==
<div style="padding: 0.5em;">
かつては、アクセントを持つ文字(例:「écoutez」)や英語では使用されない句読点(例:「¿Entiende?」)を含む文字列をスクリプトに含めると、スクリプトはコンパイルされない状態でした。
 
2008年の春から夏にかけて、スクリプトはテキスト文字列にアクセントを含めてもコンパイルできるようになりました。
 
つまり、以下のようになりました:
 
<source lang="lsl2">string hello = "Avatar écoutez";</source>
</div></div>
 
<div id="box">
==文字列の長さの制約==
<div style="padding: 0.5em;">
このページの冒頭で述べたように、単一の文字列の長さは、利用可能な[[llGetFreeMemory/ja|スクリプトメモリ]]によってのみ制限されます。ただし、いくつかの操作上の制約が存在します。多くの{{LSLGC|Communications/ja}}関数と一部の他の関数も、入力文字列に制限を課しています。これらの制約は、実行時にエラーメッセージが表示されたり、文字列が「静かに」切り詰められること(つまり、エラー通知もなく、それが行われたことを示す情報も提供されないこと)があります。
 
'''例'''
* [[llSay/ja|llSay]] -  llSayを使用する際、発言されるテキスト文字列は、LSOとMonoの両方で1024文字に切り詰められます(これはMono(UTF-16)では2048バイトのメモリスペースです)。
* [[llGetNotecardLine/ja|llGetNotecardLine]] - ノートカードから行を読み込む際、1023文字より長い行は静かに切り詰められます(以前は255文字でしたが、[https://releasenotes.secondlife.com/simulator/2021-10-25.565008.html SLS 565008] により増加しました)。
* [[llDialog/ja|llDialog]] - メッセージやボタンのテキストが長すぎる場合、その関数が呼び出されたときに非致命的なエラーが発生します。
 
'''Notes'''<br/>
この種の制約は常に文書化されており、文書に制約が記載されていない場合、その言語の通常の範囲外である既知の制約は存在しないことを意味します。
</div>
 
<div id="box">
 
==文字列のトリミング==
<div style="padding: 0.5em;">
以前は、文字列のトリミングはStrife Onizukaのライブラリなど、ユーザーが作成した関数を使用する必要がありました。
 
しかし、現在では、[[llStringTrim/ja|llStringTrim]]というネイティブのLSL関数が存在し、先頭および/または末尾のスペースを削除するために使用できます。ただし、文や文字列の中にユーザーが入力した余分なスペースを削除しないことに注意してください。また、他のネイティブのLSL関数も存在しません。
 
以下のコードは、文字列内のすべての二重スペースを削除し、先頭および末尾のスペースも削除します。ただし、かなりのメモリオーバーヘッドが必要です。
 
<source lang="lsl2">string myTrimmedText = llDumpList2String(llParseString2List(src, [" "], []), " ");</source>
 
チャット、ノートカード、プリムの名前や説明、または他の「自由な」ソースからユーザーのテキスト入力を受け入れる場合、それを処理を開始する前に必ず[[llStringTrim/ja|llStringTrim]]を行うことをお勧めします。
</div></div>
 
<div id="box">
== 例 ==
<div style="padding: 0.5em;">
<source lang="lsl2">integer int = 48934;
string str = (string)int;
string str_2;
str_2 = str;</source>
</div></div>
<div id="box">
== よく用いる関数 ==
<div style="padding: 0.5em;">
=== ユーザが作成したユーティリティ関数 ===
これらの関数は、組み込みのLSL関数では対応していない操作を実行するために、LSLユーザーによって作成され、提供されました。
 
{|{{Prettytable}}
|+
|-{{Hl2}}
!function
!purpose
|-
|| [[Chr]] || 指定されたコードのUnicode文字を返します。[[Ord]]関数とも関連があります。
|-
|| [[Float2String]] || 浮動小数点数を整形されたテキスト形式で出力し、オプションで丸めることができます。
|-
|| [[Left]] || 指定された区切り文字の左側のテキストを返します。
|-
|| [[Like]] || ある単語が別の単語の一部と一致するかどうかを確認します。
|-
|| [[Ord]] || 文字の順序(Unicodeコード)を返します。[[Chr]]関数とも関連があります。
|-
|| [[RandomString]] || ランダムな文字列を生成します。
|-
|| [[RemoveHTMLTags]] || 文字列からHTMLタグ(および改行文字)を削除します。
|-
|| [[Right]] || 指定された区切り文字の右側のテキストを返します。
|-
|| [[Library_Combined_Library#str_replace|str_replace]] || 全ての対象string内の、stringインスタンスとその他のstringを置換します。
|-
|| [[Stristr]] || 指定されたneedle文字列の最初の出現箇所からhaystackの末尾までの文字列を返します。
|-
|| [[SplitLine]] || '改行'エスケープコードをstringの特定の箇所に挿入します。
|-
|| [[Library_Combined_Library#TrimRight|TrimRight]] || stringの右端から文字の余計な空白を削除します。
|-
|| [[Library_Combined_Library#TrimLeft|TrimLeft]] || stringの左端から文字の余計な空白を削除します。
|-
|| [[Library_Combined_Library#TrimBoth|TrimBoth]] || stringの両端から文字の余計な空白を削除します。
|-
|| [[WrapText]] || テキストを指定した行の長さに分割します。
|}
 
=== スクリプトライブラリ内のテキスト関係のスクリプト ===
{| {{Prettytable}}
|-
|{{Hl2}}| '''スクリプト名'''
|{{Hl2}}| '''製作者'''
|{{Hl2}}| '''説明'''
|-
||[[ParseString2List]]
||[[User:Strife Onizuka|Strife Onizuka]]
||[[llParseString2List/ja|llParseString2List]]および[[llParseStringKeepNulls/ja|llParseStringKeepNulls]]と同じ機能を提供しますが、8つ以上の区切り文字やセパレータが必要な場合に使用します。したがって、8つ以上のセパレータや区切り文字がある場合、[[llParseString2List/ja|llParseString2List]]および[[llParseStringKeepNulls/ja|llParseStringKeepNulls]]関数の呼び出しを[[Parse_String_To_List|ParseString2List]]に置き換えることができます。
|-
 
||[[String Compare]]
||[[User:Xaviar Czervik|Xaviar Czervik]]
||2つの文字列を比較し、それらが同じ場合に1、-1、または0を確実に返します。
|-
||[[XyText 1.5|XyText]]
||[[User:Xylor Baysklef|Xylor Baysklef]]
|| プリムにテキスト(最大10文字)を表示します。必要なだけ多くのプリムを使用できます。
|-
||[[XyyyyzText|XyyyyzText]]
||[[User:Criz Collins|Criz Collins]]
|| プリムにテキスト(最大10文字)を表示します。1つの単一のテキストではなく、各行ごとに異なるテキストを表示し、次の行に分割されます。詳細はこちらを参照してください http://screencast.com/t/1wMLujLcEO
|-
||[[XyzzyText|XyzzyText]]
||[[User:Thraxis Epsilon|Thraxis Epsilon]] and [[User:Gigs Taggart|Gigs Taggart]]
|| プリムにテキスト(最大10文字)を表示します。XyTextよりも効率的です。
|}
</div>

Latest revision as of 13:56, 3 October 2023

stringはテキストデータです。

Stringの値はLSLテキストを定義するときに、ダブルクォーテーション(" ")て囲まれます。

文字列には、「NUL」文字を除いて任意の文字を使用できます。ただし、一部の文字はエスケープする必要がある場合があります(詳細についてはこのページのEscape Codes sectionを参照してください)。 「NUL」文字はUnicode値U+0000であり、LSL文字列に存在できません。したがって、例えばllUnescapeURL("%00")は空の文字列""を結果とします。

stringの長さは、利用可能なスクリプトメモリによってのみ制限されます(操作上の制約についてはこのページのString Length Restraintsセクションを参照してください)。ただし、Monoでは文字列はUTF-16を使用し、1文字あたり2つのメモリバイトを占有します。

stringは、+演算子を使用して連結(結合)できます。ただし、文字列をグローバル変数として定義する場合、+演算子は実行可能な命令として扱われ、コンパイラによって処理されないことに注意してください。連結は、実行可能なコード内でのみ行うことができます。つまり、ユーザー定義の関数内またはイベント内で行うことができます。

一部の文字列操作は、大文字と小文字の変換などの組み込み関数を使用して行うことができます。置換、左端取得、右端取得、テキストの装飾などの他の操作は、他のLSLユーザーによって開発された関数を使用して行う必要があります(これに関する例はこのページの一番下にあります)。

文字列の出力がユーザーの画面やメニューに表示される際のフォント、サイズ、太さ、色などについては、制御できません。画面に表示されるテキストの外観(たとえば、テキストからのチャットなど)は、ユーザーによって制御されます(ただし、デフォルトを変更するユーザーはあまり多くありません)。文字が大文字または小文字で表示されるかどうかのみを制御できます。

(表示されるテキストの色を制御できる唯一の場合は、Floating Textを使用する場合です。)

String 例:

"Hello Avatar!"
"Yes"
"No"
"It's 10 o'clock."
"I am 21 years old!"
"Help " + "me"
EOF

//以下の2つのstringは同じ値です。

"I scream,\nyou scream,\nwe all scream,\nfor ice-cream!"
"I scream,
you scream,
we all scream,
for ice-cream!"


変数: string name;

string name;

宣言するstring型の変数をnameと名づけて、""にします。

• variable name 変数名

変数: string name = value;

string name = value;

宣言するstring型の変数をnameと名づけて、valueの値をいれます。

• variable name 変数名
• expression value string 要素もしくは定型値

型の変換: (string)value

(string)value

valueをstring型の値に変換します。

• expression value 要素もしくは定型値

演算子

ほかの情報は演算子 を参照します。

結合: value1 + value2

(value1 + value2)

入力での編集以外で、2つのstringを1つのstringに結合します。value2value1を加えて、結果のstringに返します。

• expression value1 string 要素もしくは定型値
• expression value2 string 要素もしくは定型値

比較: value1 == value2

(value1 == value2)

2つのstringを比較して、同じ長さで同じ文字なら1を返し、そうでなければ0を返します。 この演算子はCの!strcmp(value1, value2)と極めて似たような働きをし、従ってCやJavaでの == 演算子と直観的に異なる故に、技術的に異なるものです。

• expression value1 string 要素もしくは定型値
• expression value2 string 要素もしくは定型値

比較: value1 != value2

(value1 != value2)

2つのstringを比較し、同じ長さで同じ文字であればzeroを返し、そうでなければ0ではないものを返します。 この演算子はCのstrcmp(value1, value2)と極めて似た働きをし、従ってCやJavaでの != 演算子と直観的に異なる故に、技術的に異なるものです。

• expression value1 string 要素もしくは定型値
• expression value2 string 要素もしくは定型値

エスケープコード

Substring Replaced with
\t 4スペース
\n 改行
\" ダブルクオーテーション
\\ バックスラッシュ

エスケープコードは、スクリプトがコンパイルされる際に変換されます。実行中には変換されません。コンパイラは、\と文字の他の組み合わせを\を削除して無視します。したがって、"\a"は"a"を意味します。 結果として、スクリプトがコンパイルされる際に含まれる文字列のみが、例えば \n が "改行" 文字に変換されます。ノートカード、チャット、HTTP、オブジェクトの名前や説明などから読み込んだテキストは、エスケープコードをチェックしないため、ノートカードに入力した \n は自動的に "改行" 文字には変換されません。何らかの理由で本当に必要な場合を除いて、自分で変換する必要があります。

CやJavaなどの言語からLSLに移行する人々は、最初はLSLの文字列エスケープルールが混乱するかもしれません。LSLでは、"\n"はCやJavaと同様にllUnescapeURL("%0A")を意味しますが、"\t"はllUnescapeURL("%09")ではなくllUnescapeURL("%20%20%20%20")を意味します。さらに、"\r"のエスケープコードは存在せず、"\r"はllUnescapeURL("%0D")ではなく単に "r" に変換されます。

エスケープされた文字の実行時の変換については、ユーザー関数Unescapeを試してみてください。

アクセントのある文字

かつては、アクセントを持つ文字(例:「écoutez」)や英語では使用されない句読点(例:「¿Entiende?」)を含む文字列をスクリプトに含めると、スクリプトはコンパイルされない状態でした。

2008年の春から夏にかけて、スクリプトはテキスト文字列にアクセントを含めてもコンパイルできるようになりました。

つまり、以下のようになりました:

string hello = "Avatar écoutez";

文字列の長さの制約

このページの冒頭で述べたように、単一の文字列の長さは、利用可能なスクリプトメモリによってのみ制限されます。ただし、いくつかの操作上の制約が存在します。多くのCommunications/ja関数と一部の他の関数も、入力文字列に制限を課しています。これらの制約は、実行時にエラーメッセージが表示されたり、文字列が「静かに」切り詰められること(つまり、エラー通知もなく、それが行われたことを示す情報も提供されないこと)があります。

  • llSay - llSayを使用する際、発言されるテキスト文字列は、LSOとMonoの両方で1024文字に切り詰められます(これはMono(UTF-16)では2048バイトのメモリスペースです)。
  • llGetNotecardLine - ノートカードから行を読み込む際、1023文字より長い行は静かに切り詰められます(以前は255文字でしたが、SLS 565008 により増加しました)。
  • llDialog - メッセージやボタンのテキストが長すぎる場合、その関数が呼び出されたときに非致命的なエラーが発生します。

Notes
この種の制約は常に文書化されており、文書に制約が記載されていない場合、その言語の通常の範囲外である既知の制約は存在しないことを意味します。

文字列のトリミング

以前は、文字列のトリミングはStrife Onizukaのライブラリなど、ユーザーが作成した関数を使用する必要がありました。

しかし、現在では、llStringTrimというネイティブのLSL関数が存在し、先頭および/または末尾のスペースを削除するために使用できます。ただし、文や文字列の中にユーザーが入力した余分なスペースを削除しないことに注意してください。また、他のネイティブのLSL関数も存在しません。

以下のコードは、文字列内のすべての二重スペースを削除し、先頭および末尾のスペースも削除します。ただし、かなりのメモリオーバーヘッドが必要です。

string myTrimmedText = llDumpList2String(llParseString2List(src, [" "], []), " ");

チャット、ノートカード、プリムの名前や説明、または他の「自由な」ソースからユーザーのテキスト入力を受け入れる場合、それを処理を開始する前に必ずllStringTrimを行うことをお勧めします。

integer int = 48934;
string str = (string)int;
string str_2;
str_2 = str;

よく用いる関数

ユーザが作成したユーティリティ関数

これらの関数は、組み込みのLSL関数では対応していない操作を実行するために、LSLユーザーによって作成され、提供されました。

function purpose
Chr 指定されたコードのUnicode文字を返します。Ord関数とも関連があります。
Float2String 浮動小数点数を整形されたテキスト形式で出力し、オプションで丸めることができます。
Left 指定された区切り文字の左側のテキストを返します。
Like ある単語が別の単語の一部と一致するかどうかを確認します。
Ord 文字の順序(Unicodeコード)を返します。Chr関数とも関連があります。
RandomString ランダムな文字列を生成します。
RemoveHTMLTags 文字列からHTMLタグ(および改行文字)を削除します。
Right 指定された区切り文字の右側のテキストを返します。
str_replace 全ての対象string内の、stringインスタンスとその他のstringを置換します。
Stristr 指定されたneedle文字列の最初の出現箇所からhaystackの末尾までの文字列を返します。
SplitLine '改行'エスケープコードをstringの特定の箇所に挿入します。
TrimRight stringの右端から文字の余計な空白を削除します。
TrimLeft stringの左端から文字の余計な空白を削除します。
TrimBoth stringの両端から文字の余計な空白を削除します。
WrapText テキストを指定した行の長さに分割します。

スクリプトライブラリ内のテキスト関係のスクリプト

スクリプト名 製作者 説明
ParseString2List Strife Onizuka llParseString2ListおよびllParseStringKeepNullsと同じ機能を提供しますが、8つ以上の区切り文字やセパレータが必要な場合に使用します。したがって、8つ以上のセパレータや区切り文字がある場合、llParseString2ListおよびllParseStringKeepNulls関数の呼び出しをParseString2Listに置き換えることができます。
String Compare Xaviar Czervik 2つの文字列を比較し、それらが同じ場合に1、-1、または0を確実に返します。
XyText Xylor Baysklef プリムにテキスト(最大10文字)を表示します。必要なだけ多くのプリムを使用できます。
XyyyyzText Criz Collins プリムにテキスト(最大10文字)を表示します。1つの単一のテキストではなく、各行ごとに異なるテキストを表示し、次の行に分割されます。詳細はこちらを参照してください http://screencast.com/t/1wMLujLcEO
XyzzyText Thraxis Epsilon and Gigs Taggart プリムにテキスト(最大10文字)を表示します。XyTextよりも効率的です。