Help us understand the problem. What is going on with this article?

Unityのリッチテキストはエスケープできない (けれど、回避はできる)

前提

  • スクリプトから動的に内容を変化させるuGUIのTextで、内容によって部分的にスタイルをコントロールできるようにしたかったので、リッチテキスト(⇒Unityマニュアル) を使用しました。
    • 例えば、左寄せで「ABC」と「X ABC」を切り替えたいような要求です。

ハマったこと

  • ユーザーが入力可能な文字列を挿入したら、文字列中にタグがあって化けてしまいました。
  • タグをエスケープしようとしたのですが、Unityのリッチテキストにはエスケープ方法がありませんでした。
  • <\< に置き換えれば、確かにタグとして認識されなくなるのですが、バックスラッシュも表示されてしまいます。

やりたいこと

  • 有効なタグにならないようにしたい。
  • なるべく入力に近い表示にしたい。

回避した方法

  • 元の文字列stringに対して、string.Replace ("<", "<\u200B").Replace (">", "\u200B>")を使うようにしました。
    • "\u200B"は、Unicodeのゼロ幅スペース(Wikipedia)です。
    • 実質的にエスケープできているといっても過言ではないですね?
  • ゼロ幅スペースに対応できない環境では、普通のスペースを使用して回避できます。
    string.Replace ("<", "< ").Replace (">", " >")

反省

  • ユーザー入力に由来する文字列を表示する場合は、リッチテキストは使わない方が良さそうです。
    • 入力データを保存したり編集したりしないなら、入力直後に処理するだけで解決しますが、編集できるなど処理前のものを残す必要がある場合は、処理前後の双方を保持するか、表示毎に処理する必要があって煩雑です。
    • 入力をそのまま保持するNameに対して、処理して返すSafeNameプロパティを追加して使い分けるようにしました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away