Wiki 9Minecraft Wiki 9Minecraft

Introduction to Custom Emojis and Font Glyphs

Add custom inline icons to chat, item names, and UI using resource pack font sheets.

5Sections
3Code examples
4Known errors

Minecraft Bedrock Edition allows creators to embed custom icons—commonly called emojis—directly into any text string by replacing Unicode Private Use Area characters in the font textures. You reach for this technique when you want to display custom currency symbols on scoreboards, button prompts in dialogue, or elemental icons inside item tooltips without modifying JSON UI files. Because these icons act as standard text characters, they work seamlessly in chat messages, `/titleraw` commands, entity names, and localization files.

How Bedrock Font Glyphs Work

Bedrock renders text by looking up characters in texture grids called glyph sheets, located in the `RP/font/` directory of a resource pack. While the standard English alphabet lives in `default8.png`, Unicode characters are divided into pages of 256 characters each, named `glyph_XX.png`, where `XX` is a two-digit hexadecimal number representing the upper byte of the Unicode code point.

To add custom emojis without overwriting real letters or symbols needed by players in other languages, creators use the Unicode Private Use Area (PUA). Specifically, the blocks at `E0` (`U+E000` to `U+E0FF`) and `E1` (`U+E100` to `U+E1FF`) are reserved for custom icons. Note that vanilla Bedrock uses `glyph_E0.png` and `glyph_E1.png` for controller button prompts, input icons, and Marketplace symbols. If you only need a few icons and want to keep vanilla controller prompts intact, you should edit a copy of the vanilla sheet or use an unused page like `glyph_E2.png` through `glyph_F8.png`.

Creating the Glyph Sheet

Every `glyph_XX.png` file is a square image divided into an 16x16 grid, giving you 256 slots per file. For standard resolution, the image size is 256x256 pixels, making each individual character cell 16x16 pixels. If you want high-resolution icons, you can scale the entire sheet up to 512x512 (32x32 pixels per icon) or 1024x1024 (64x64 pixels per icon), as long as the aspect ratio remains 1:1 and the dimensions are a power of two.

The grid is read from left to right, top to bottom. Both the columns and rows are numbered in hexadecimal from `0` to `F` (0 to 15 in decimal). To find the Unicode character for a specific cell on `glyph_E1.png`, you combine the file code (`E1`), the row hex digit, and the column hex digit. Once your image is ready, save it in your resource pack at `RP/font/glyph_E1.png`.

Grid Position (Row, Col)Hex CoordinatesUnicode Code PointJSON Escape Sequence
Top-left (Row 0, Col 0)Row 0, Col 0U+E100\uE100
First row, second slot (Row 0, Col 1)Row 0, Col 1U+E101\uE101
First row, last slot (Row 0, Col 15)Row 0, Col FU+E10F\uE10F
Second row, first slot (Row 1, Col 0)Row 1, Col 0U+E110\uE110
Bottom-right (Row 15, Col 15)Row F, Col FU+E1FF\uE1FF

Using Emojis in Language Files

The cleanest place to store and reference custom emojis is inside your resource pack's localization file (`RP/texts/en_US.lang`). In `.lang` files, you cannot use the `\uXXXX` escape syntax directly; the game will print those literal characters instead of the icon. Instead, you must paste the actual raw Unicode character into the file.

Make sure your code editor is set to save the `.lang` file with UTF-8 encoding (without BOM). In your editor, the pasted character will usually look like a blank space, a missing-character box, or a generic placeholder symbol. This is normal—Minecraft will swap it with your texture tile in-game.

RP/texts/en_US.lang
item.custom:ruby_sword.name= Ruby Sword
ui.shop.currency_display=Coins:  %s
chat.welcome.message=Welcome to the server! Press  to open the guide.

Using Emojis in Rawtext and Commands

When sending messages through `/tellraw`, `/titleraw`, actionbars, or dialogue files, you use Bedrock's `rawtext` JSON structure. Unlike `.lang` files, JSON files support standard Unicode escape sequences (`\uXXXX`). This makes your code much easier to read and maintain because you do not have to deal with invisible placeholder characters.

You can either write the escape sequence directly inside a `text` component, or use a `translate` component that points to one of the keys you defined in `en_US.lang`. Using `translate` is generally better for large projects because if you ever move an icon to a different slot on the glyph sheet, you only have to update the `.lang` file once.

BP/dialogue/merchant_scene.json
{
  "format_version": "1.17.0",
  "minecraft:npc_dialogue": {
    "scenes": [
      {
        "scene_tag": "merchant_greeting",
        "npc_name": {
          "rawtext": [
            {
              "text": "\uE100 Travelling Merchant"
            }
          ]
        },
        "text": {
          "rawtext": [
            {
              "translate": "ui.shop.currency_display",
              "with": ["50"]
            }
          ]
        }
      }
    ]
  }
}

Using Emojis in Script API

If your behaviour pack uses the `@minecraft/server` Script API, JavaScript strings natively support the exact same `\uXXXX` escape sequences as JSON. You can pass these strings directly into `player.sendMessage()`, `onScreenDisplay.setActionBar()`, or item lore arrays.

Remember that standard Minecraft color codes (`§a`, `§c`, etc.) will tint your custom glyph if they appear before the emoji in the string. Always place a reset code (`§r`) immediately before your Unicode escape sequence so the icon renders with its true texture colors.

BP/scripts/main.js
import { world, system } from "@minecraft/server";

system.runInterval(() => {
  for (const player of world.getAllPlayers()) {
    player.onScreenDisplay.setActionBar("§6Gold: §r\uE101 120   §bMana: §r\uE102 50/50");
  }
}, 20);

Which versions this applies to

Applies to all modern Bedrock versions (1.16.0 and above). No experimental toggles are required for custom font sheets.

When it does not work

What you seeWhyThe fix
The emoji renders tinted green, red, or dark grey instead of its original colors.A formatting color code (like §a or §7) was used earlier in the text string. Bedrock treats font glyphs like standard text and multiplies their pixel colors by the active text color.Place the reset formatting code (§r) directly before the emoji character so it renders with pure white multiplication (its original texture colors), then re-apply your text color code afterwards.
Adjacent emojis or letters are cut off, or parts of a neighboring icon bleed into the text.Bedrock automatically calculates character width by scanning each 16x16 cell for non-transparent pixels. If your icon touches the very edge of its 16x16 cell, or if stray semi-transparent pixels were left in empty cells, the font renderer miscalculates the kerning.Keep a 1-pixel fully transparent border on the left and right edges of every 16x16 cell, and make sure unused cells have an alpha value of 0.
Controller button prompts in the vanilla UI disappear or turn into blank spaces when the pack is active.You created a brand new glyph_E0.png or glyph_E1.png with mostly empty transparent space. Because resource packs replace the entire texture file rather than merging individual slots, all the vanilla controller icons on that sheet were wiped out.Either copy the vanilla glyph_E0.png / glyph_E1.png file as your base and only draw in the empty slots, or move your custom icons to an unused sheet such as glyph_E2.png (\uE200 to \uE2FF).
The literal text '\uE100' prints on screen instead of the icon.You typed the JSON escape sequence '\uE100' inside an en_US.lang file or directly into the in-game chat box, neither of which parses backslash Unicode escapes.Use '\uE100' only inside JSON files and JavaScript files. For .lang files and in-game chat, copy and paste the raw Unicode symbol itself.

Reference, straight from the game files

Read out of the game itself, so the ids match the version you are building for.