5
1

More 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プロパティを追加して使い分けるようにしました。
5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1