前提
- スクリプトから動的に内容を変化させるuGUIのTextで、内容によって部分的にスタイルをコントロールできるようにしたかったので、リッチテキスト(⇒Unityマニュアル) を使用しました。
- 例えば、左寄せで「ABC」と「X ABC」を切り替えたいような要求です。
ハマったこと
- ユーザーが入力可能な文字列を挿入したら、文字列中にタグがあって化けてしまいました。
- タグをエスケープしようとしたのですが、Unityのリッチテキストにはエスケープ方法がありませんでした。
-
<
を\<
に置き換えれば、確かにタグとして認識されなくなるのですが、バックスラッシュも表示されてしまいます。
やりたいこと
- 有効なタグにならないようにしたい。
- なるべく入力に近い表示にしたい。
回避した方法
- 元の文字列
string
に対して、string.Replace ("<", "<\u200B").Replace (">", "\u200B>")
を使うようにしました。-
"\u200B"
は、Unicodeのゼロ幅スペース(Wikipedia)です。 - 実質的にエスケープできているといっても過言ではないですね?
-
- ゼロ幅スペースに対応できない環境では、普通のスペースを使用して回避できます。
string.Replace ("<", "< ").Replace (">", " >")
反省
- ユーザー入力に由来する文字列を表示する場合は、リッチテキストは使わない方が良さそうです。
- 入力データを保存したり編集したりしないなら、入力直後に処理するだけで解決しますが、編集できるなど処理前のものを残す必要がある場合は、処理前後の双方を保持するか、表示毎に処理する必要があって煩雑です。
- 入力をそのまま保持する
Name
に対して、処理して返すSafeName
プロパティを追加して使い分けるようにしました。