infoMore than 5 years have passed since last update.
Unityのリッチテキストはエスケープできない (けれど、回避はできる)
Last updated at Posted at 2019-05-24
前提
- スクリプトから動的に内容を変化させるuGUIのTextで、内容によって部分的にスタイルをコントロールできるようにしたかったので、リッチテキスト(⇒Unityマニュアル) を使用しました。
- 例えば、左寄せで「ABC」と「X ABC」を切り替えたいような要求です。
ハマったこと
- ユーザーが入力可能な文字列を挿入したら、文字列中にタグがあって化けてしまいました。
- タグをエスケープしようとしたのですが、Unityのリッチテキストにはエスケープ方法がありませんでした。
-
<
を \<
に置き換えれば、確かにタグとして認識されなくなるのですが、バックスラッシュも表示されてしまいます。
やりたいこと
- 有効なタグにならないようにしたい。
- なるべく入力に近い表示にしたい。
回避した方法
- 元の文字列
string
に対して、string.Replace ("<", "<\u200B").Replace (">", "\u200B>")
を使うようにしました。
-
"\u200B"
は、Unicodeのゼロ幅スペース(Wikipedia)です。
- 実質的にエスケープできているといっても過言ではないですね?
- ゼロ幅スペースに対応できない環境では、普通のスペースを使用して回避できます。
string.Replace ("<", "< ").Replace (">", " >")
反省
- ユーザー入力に由来する文字列を表示する場合は、リッチテキストは使わない方が良さそうです。
- 入力データを保存したり編集したりしないなら、入力直後に処理するだけで解決しますが、編集できるなど処理前のものを残す必要がある場合は、処理前後の双方を保持するか、表示毎に処理する必要があって煩雑です。
- 入力をそのまま保持する
Name
に対して、処理して返すSafeName
プロパティを追加して使い分けるようにしました。
5Go to list of users who liked
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
What you can do with signing up