This site is an archive of ama.ne.jp.

icon of Amane Katagiri 輝くイカスミと「でェョ姫」について

MinecraftのBedrock版2における奇妙な挙動として、輝くイカスミで発光させた看板に「でェョ姫」というテキストを設定すると明るさが暗くなる、というものが知られています1

「でェョ姫」と設定された輝く看板が暗く光っている様子

Mojiraにもいくつか関連する報告が上がっていますが、ゲームの進行に支障をきたすほどの事象ではないせいか、あまり注目を集めている様子はありません。輝くイカスミがBedrock版に追加されたのは2021年2月のことで、かれこれ4年以上はこのバグが放置されているわけです。

そもそも輝くイカスミとは、ヒカリイカという青白く光るイカがドロップするアイテムです。通常のイカから得られるイカスミが主に黒い染料として使われるのに対して、輝くイカスミは看板や額縁に明るさを伴う装飾効果を与えます。

具体的には、看板や吊り看板に使用してテキストの周囲を光らせたり、ふつうの額縁と組み合わせて輝く額縁をクラフトできます。周囲が暗ければそれなりに見やすい標識として役に立ちますが、あくまで装飾上の効果しかないことには注意が必要です3

輝く看板や輝く額縁を設置して「でェョ姫」と設定された看板のみが暗く光っている様子

前述したバグは、「でェョ姫」という文字列をテキストに設定している間だけ発生します。もともと光っていた看板でも「でェョ姫」と設定すれば暗くなり、元に戻せばすぐ明るい光を取り戻すのです。また、看板の種類や色も関係ありません。つまり、看板自体が変質するようなバグではなく、あくまでテキストの装飾を解析・表示する部分に問題があります。

様々な種類の輝く看板で「でェョ姫」と設定した場合に暗く光っている様子

さて、Minecraft上で看板のテキストを装飾できるのは、輝くイカスミだけではありません。染料を用いればテキスト全体を好きな色に変更できますし、Bedrock版では装飾コードと呼ばれる特別な文字 § を用いた簡易的なマークアップも用意されています4。装飾コードは § とその直後の1文字で構成されていて、後ろに続くテキストの文字色やスタイルを指定できます。

以下の例では、 4行にわたって装飾コードを含んだテキストを展開しています。まず、「すっぴん」の後にある §6 というコードによって、後に続く「ゴールド」が金色に変わります。そして、その効果は §i という鉄のカラーコードで上書きされるまで続きました。途中で §l および §o を用いてそれぞれ太字と斜体を適用しながら後半へ、最後に §r で全ての装飾をリセットしてテキスト末尾の「~ぎる」と「装飾」まで進みました。

装飾コードを含むテキストを看板に設定している様子

装飾コードを含むテキストを設定した輝く看板が光っている様子

この装飾コードを適用した看板に輝くイカスミを使用すると、またおかしな挙動が起きていることに気付きます。「装飾」という文字列が明るく光っているのに対して、「すっぴん」や「~ぎる」という文字列は「でェョ姫」と同じ暗さになっているのです。

しかし、一方で「すっぴん」という文字列自体に看板を暗くする効果はなさそうです。試しに「すっぴん」と「装飾」の位置を入れ替えてみると、今度は「装飾」の方が暗くなってしまいました。

先ほどの輝く看板のテキストで「すっぴん」と「装飾」を入れ替えた様子

ここで「装飾」や「すっぴん」が明るく光っていたテキスト最終行に「でェョ姫」を設定すると、すぐに暗い光に変わります。つまり、この現象は文字列自体に原因があるのではなく、文字列の位置によって引き起こされたと解釈できるでしょう。

輝く看板で本来なら明るく光る部分に「でェョ姫」を設定すると暗く光る様子

他にもいくつか試してみたところ、装飾コードがある行に色の設定されていない文字列が含まれていると、この現象が発生することが分かりました。ここでいう「色が設定されていない」とは、色の装飾コードが初めて出てくるまでの部分(最初の例における「すっぴん」)、あるいは §r で装飾をリセットしてから再び色の装飾コードが出てくるまでの部分(最初の例における「~ぎる」と「装飾」)であって、明示的に黒 §0 を設定した文字列とは異なります。

まとめると、輝くイカスミを使用した看板の文字列が暗くなる挙動として、以下の2つが存在することが分かりました。

  1. ある特定の文字列(ここでは「でェョ姫」)を設定した場合
  2. 装飾コードがある行に色の設定されていない文字列を含めた場合

このうち、2の挙動は比較的理解しやすいものです。色が設定された文字列は、通常の文字列のように周囲が明るく光るのとは逆に、文字色自体が明るくなって周囲はより暗い色に変わります。おそらく各カラーコードに対してテキストを囲む色が決まっていて、色が未設定の文字列はグレーで発光するという定義になっているのでしょう。

しかし、1のように特定の文字列で同様の現象が起きるのはやはり奇妙です。ひょっとすると、装飾コードを含む特殊な行の挙動が、何らかの条件で暴発するのかもしれません。例えば、「ある特定の文字列を含むと装飾コードが設定された行として扱われる」なら、実際には装飾コードを含まない文字列全体が暗く発光するはずです。そうすると、この2つの挙動は実際には1つの原因で起きる単一の現象として説明できるでしょう。

1の挙動を引き起こす特定の文字列についてもう少し掘り下げましょう。Bedrock版のリソースパック作成ガイドなどを見てみると、プログラム内部ではUTF-8が用いられているようです。ふつうはコードポイントをそのまま処理するわけではないので、これらの文字列をUTF-8でエンコードして観察してみます。

まず「でェョ姫」をUTF-8でエンコードすると以下のようになります:

  • で: \xe3\x81\xa7
  • ェ: \xe3\x82\xa7
  • ョ: \xe3\x83\xa7
  • 姫: \xe5\xa7\xab

それぞれ3バイトでエンコードされており、共通のバイト \xa7 を含んでいることが分かります。一見何も関係なさそうな文字でしたが、意外な共通点を持っていました。

では、装飾コードの開始記号である § はどうでしょうか? § はもともとセクションを示すための一般的な約物であって、特殊な制御文字として扱うのはMinecraft上だけの話です。この § をUTF-8でエンコードすると \xc2\xa7 となり、またしても共通のバイト \xa7 を含んでいるのが明らかになりました。

そうなると話は早いですね。UTF-8で \xa7 を含む文字列を探してみましょう。

for start, end in [
    (0x0000, 0x007F), # 基本ラテン文字
    (0x0080, 0x00FF), # ラテン文字補助
    (0x0100, 0x017F), # ラテン文字拡張A
    (0x0180, 0x024F), # ラテン文字拡張B
    (0x0370, 0x03FF), # ギリシャ文字
    (0x0400, 0x04FF), # キリル文字
    (0x3040, 0x309F), # ひらがな
    (0x30A0, 0x30FF), # カタカナ
    (0x4E00, 0x9FFF), # CJK統合漢字
    (0xAC00, 0xD7AF), # ハングル音節
]:
    for code_point in range(start, end + 1):
        try:
            char = chr(code_point)
            if 0xa7 in char.encode('utf-8'):
                print(char)
        except ValueError:
            continue

ここからひらがな・カタカナ・常用漢字を抜き出すと以下の57文字が得られます:

僧 勧 圧 大 姉 始 姓 委 姻 姿 巧 座 弧 性 惧 憧 控 昧 構 様 槽 湧 照 牧 璧 秀 科 秒 秩 称 移 粧 糧 覧 角 解 触 諧 霧 顧 駄 駆 駐 駒

タイトルの「でェョ姫」はいずれもこのリストの中にあり、そのほかにもそう珍しくない漢字が多数含まれていました。また、以下の記号・漢字でも、同様の現象に関する報告が1年~半年ほど前にいくつか上がっています。

最後に、このリストの文字が発光を暗くする原因であることを確認するために、これらの漢字からいくつか選んで看板にテキストを設定してみました。

輝く看板に設定した0xa7を含む行が暗く光っている様子

予想通り、貧・駅・租・旧・秘・欧・私・寧を含む行が暗くなっていて、それ以外は明るく光っているのが分かります。実は冒頭で述べた「でェョ姫」だけではなく、あらゆる「姫」を含む行がこのバグを引き起こします。あらゆる「姉」もあらゆる「性」も同じです。当初の予想よりかなり広範ですが、看板を輝くイカスミで光らせる必要がありますし、染料や装飾コードで着色した方が見た目もよいので、それらの割合を掛け合わせると出会う確率はそう高くないかもしれません。

ちなみに、不適切な表現として ##### された文字列にこれらが含まれていた場合も、このバグは起こらなくなります。

結論として、先に挙げた2つの挙動は「UTF-8表現で \xa7 を含む行において、色の設定されていない文字列が暗いグレーで発光する」という1つの理由で説明できると分かりました。そもそも § のUnicodeコードポイントが U+00a7 ですし、UnicodeコードポイントでのチェックとUTF-8バイト列でのチェック( \xc2\xa7 )を混同して、 \xa7 のみでチェックを行ってしまった、というくらいのことかもしれません。

このようなUTF-8のバイト列を処理する際の考慮不足が引き起こすバグは、Latin-1と0x85のなぞでも出会った経験があります。UTF-8が1コードポイントあたり1~4バイトという可変長で表現する都合上、エンコードのアルゴリズムはそれなりに複雑で、同じバイト列でも出現位置によって異なる文字を構成しうるわけです。

みなさんもぜひ、いろいろな怪しいテキストで暗く光る看板を作ってみてくださいね。飽きたら壊して回収するか、ふつうのイカスミを使えば効果を解除できます。


  1. Java版では起こりません: 参考画像 

  2. 2025年5月末時点でv1.21.82です。 

  3. 画面上では光って見えますが、Minecraft上で効果がある明るさは持っていません。 

  4. Java版でもワールド名やサーバーの説明など限られた範囲で装飾コードを利用できます。ただし、装飾コードの解釈や効果が一部異なるようです。 

  5. UTF-8表現で \xc3\xa7 

  6. UTF-8表現で \xd0\xa7 

  7. UTF-8表現で \xe5\x90\xa7