[unity]テキストに見えない unicode 0x200b が入ってるよって話

ふと、今まで問題なかった文字列がエラーを返すようになった。
あれ? 今までと同じものを渡してるんだけど?

Visual Studio で文字列を確認するも、問題なかった文字列と、問題のある文字列の区別がつきませんでした。

↓ 問題のない文字列
"ey0quqe9RjHYSVGVS​"
"ey0quqe9RjHYSVGVS"
↑ 問題のある文字列​

どこをどう見ても一緒。でも、上はエラーにならず、下はエラーになる。
裸の王様ならぬ「裸のPC」にはなんかが見えてるんでしょうか?

ふと、「問題のある文字列はコピペで持ってきたこと」を思い出します。

ここからコピペした文字列はダメで、同じ文字を手で打った場合は大丈夫らしいと言う事に気づきました。
そこで、Visual Studio ではなく Sublime Text というテキストエディタにコピーして確認。

なんですか <0x200b> って……。

Visual Studio さんでは一切見当たらなかった謎コードがコピペされていました。

犯人は透明な Unicode 文字

調べてみると 0x200b は Unicode に数ある透明文字(制御コード)の1つでした。
制御コードといえば /t /n /r /b くらいしか普段意識していませんでしたが、これが結構な数存在し、セキュリティ攻撃に使われることもあるようです。

以下のページが制御文字について詳しいので、気になる人は確認してみてください。

TextMeshProUGUI でコピペすると、制御コードがついてくる?

もしそうだとしたら、常に意識しておかないと色々問題があるな……と思っていくつか調べてみたところ、普通の TextMeshProUGUI であれば制御コードはついてこないようです。

普通じゃない TextMeshProUGUI はなにかと言うと、TMP_InputField

これに付属している TextMeshProUGUI から文字列をコピペすると必ず 0x200b がついてくるようでした。

unity2020.3、2021.3 共に発生しているので、これは仕様なのだと思われます。

対処法

TextMeshProUGUI からはコピーせず、大元の TMP_InputField からコピーすること。
画像だと、Text からはコピーせず、InputField からコピーしようという事です。

これだけなんですが、Inspector の見た目は一緒なんで(私の場合)つい TextMeshProUGUI からコピーする事はあり得ます。
ということで、テキストエディタで表示できないものか軽く調査。

VS Code

Render Control Characters に✓を入れておくと、制御文字のいくつかは表示されました。
が、0x200b は表示されませんでした……。

Visual Studio 2019

こちらのヘルプで「双方向テキスト制御文字の表示」というのがあるのですが、Microsoft Visual Studio Enterprise 2019 には見当たりませんでした……。2022 にはあるかもしれません。

Sublime Text

制御文字を確認するためなら今の所これが一番楽なエディタ。
それのためだけに入れるかどうかは別として。

メモ帳

出るわけがなかった。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA