How Bedrock Font Sheets Work
Bedrock does not have a dedicated emoji registration component or a JSON file for declaring new icons. Instead, the text renderer looks for 256-character sprite sheets inside the RP/font/ directory of your resource pack. Each sheet corresponds to a block of 256 Unicode code points, arranged in a 16-column by 16-row grid.
For custom add-ons, creators use the Unicode Private Use Area (PUA), which spans from U+E000 to U+F8FF. Because the Unicode consortium leaves this range unassigned by standard fonts, Bedrock reserves several sheets within it—most notably glyph_E0.png and glyph_E1.png—for game icons and creator content. When you type or print a character from one of these ranges, the game slices the matching cell out of the PNG and draws it inline at the current text height.
Vanilla Bedrock already uses the E0 and E1 sheets for controller buttons, mouse icons, and resource indicators like Minecoins. However, most of glyph_E1.png and the entirely unused sheets from E2 through F8 are empty in the base game, giving you thousands of blank slots for custom artwork.
| File Name | Unicode Range | Vanilla Usage and Notes |
|---|---|---|
| RP/font/glyph_E0.png | U+E000 – U+E0FF | Used heavily by vanilla for Xbox, PlayStation, Switch, and touch input icons. Avoid overwriting the top rows unless you want to reskin controller prompts. |
| RP/font/glyph_E1.png | U+E100 – U+E1FF | First row contains vanilla store, agent, and tip icons (U+E100 to U+E10D). The rest of the sheet is blank in vanilla and is the most common place for add-on emojis. |
| RP/font/glyph_E2.png to glyph_F8.png | U+E200 – U+F8FF | Unused by vanilla Bedrock. Creating any of these files in your resource pack activates that 256-character range. |
Creating the Glyph Texture
A glyph sheet must be a square PNG image with an alpha channel, saved directly inside RP/font/. The standard resolution is 256x256 pixels, which gives each icon on the 16x16 grid an exact 16x16 pixel cell. If you need higher-resolution emojis, you can double the canvas to 512x512 (32x32 per cell) or 1024x1024 (64x64 per cell); the engine automatically scales the cell down to fit the line height of the text.
If you choose to edit glyph_E0.png or glyph_E1.png, start by copying the original file from the vanilla Bedrock resource pack template rather than starting from a blank canvas. If you start with a completely transparent image on those two sheets, every vanilla controller prompt or UI icon on that sheet will turn invisible while your pack is active.
When drawing your icon inside its cell, keep in mind that Bedrock automatically trims empty transparent columns on the left and right of each character so that text kerning looks natural. If your icon is very narrow—for example, a 4-pixel-wide sword—the characters before and after it will pull in tightly against the blade. If you want an emoji to maintain a fixed square width regardless of its shape, place a single pixel with 1% opacity (alpha value 1 out of 255) in the far-left and far-right columns of the cell. The pixel is invisible to the player, but it forces the font renderer to treat the cell as full width.
Calculating the Unicode Character
Every cell on the 16x16 grid maps to a four-digit hexadecimal number. The first two digits come from the file name (for example, E1 in glyph_E1.png). The third digit is the row index from top to bottom (0 through F), and the fourth digit is the column index from left to right (0 through F).
To find the character for the cell in the second row (index 1) and fourth column (index 3) of glyph_E1.png, combine the sheet prefix E1, the row 1, and the column 3 to get the code point U+E113. In JavaScript and JSON strings, you can write this directly as the escape sequence \uE113. In .lang files or in-game chat, you paste the literal character itself.
| Grid Position (0-indexed) | File | Hex Code Point | JSON / JS Escape |
|---|---|---|---|
| Row 0, Column 0 (Top-left) | glyph_E1.png | U+E100 | \uE100 |
| Row 0, Column 15 (Top-right) | glyph_E1.png | U+E10F | \uE10F |
| Row 1, Column 0 (Second row, first icon) | glyph_E1.png | U+E110 | \uE110 |
| Row 15, Column 15 (Bottom-right) | glyph_E1.png | U+E1FF | \uE1FF |
Using Emojis in Localization and Commands
Once your PNG is in RP/font/, you can reference the glyphs in your pack's language files. Because .lang files do not parse \uXXXX escape sequences, you must copy and paste the actual Private Use Area character into the file and save it with UTF-8 encoding. In most code editors, the pasted character will look like an empty box or a question mark diamond; this is normal because your computer's system font does not have your Minecraft sprite sheet loaded.
Be aware of how color codes interact with custom glyphs. If a string in a .lang file or chat message precedes your emoji with a section-sign formatting code (such as §c for red or §e for yellow), Bedrock multiplies your sprite's RGB values by that color, tinting the entire icon. Always place §r (reset) immediately before a custom glyph if it follows colored text, and re-apply your text color afterward.
item.custom:ruby_sword.name=§r §cRuby Sword
chat.custom:quest_complete=§r §aQuest Completed! §r +50 GoldSending Emojis with JSON Rawtext and Script API
When sending messages through commands like /tellraw, /titleraw, or through the @minecraft/server Script API, you do not need to paste the invisible box character. Because both rawtext and JavaScript parse standard JSON unicode escapes, you can write \uE110 directly in your code. This is much easier to read and prevents encoding accidents when multiple developers work on the same repository.
Below is a behaviour pack function file using /tellraw to display an icon from row 1, column 0 of glyph_E1.png alongside colored text:
{
"format_version": "1.17.0",
"minecraft:npc_dialogue": {
"scenes": [
{
"scene_tag": "merchant_intro",
"npc_name": {
"rawtext": [
{
"text": "\uE110 Wandering Jeweler"
}
]
},
"text": {
"rawtext": [
{
"text": "Bring me 10 Emeralds \uE112 and I will forge you a ring."
}
]
}
}
]
}
}Which versions this applies to
Applies to all modern Bedrock versions (1.16.0 through 1.21+). Font glyph sheets are a core resource pack feature and do not require any experimental toggles.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The emoji renders with a heavy red, yellow, or dark tint instead of its true PNG colors. | A formatting code (like §c or §7) earlier in the text string is still active when the font renderer reaches your glyph, causing the engine to multiply the sprite's pixels by the text color. | Insert §r immediately before the emoji character to reset the formatting state to pure white, then place your desired text color code after the emoji. |
| Adjacent letters overlap the emoji, or a small icon has no space around it. | Bedrock's glyph width scanner strips transparent columns from the left and right edges of each 16x16 cell. If your artwork does not touch the edges of the cell, the bounding box shrinks. | Place a single pixel with an alpha value of 1 (out of 255) on the far-left and far-right borders of the 16x16 cell to force full-width spacing without being visible. |
| In-game text shows strange accented Latin characters (such as 'î„ ') instead of the icon when loaded from en_US.lang. | The .lang file was saved in Windows-1252 or ANSI encoding instead of UTF-8, splitting the 3-byte Unicode character into separate legacy characters. | Re-open RP/texts/en_US.lang in your code editor, change the file encoding to UTF-8 (without BOM), re-paste the character, and save. |
| Vanilla controller button prompts and Minecoin icons disappear across the entire game UI. | You created a new, blank glyph_E0.png or glyph_E1.png from scratch, overwriting the vanilla icons that live on those sheets with empty transparency. | Copy the original glyph_E0.png or glyph_E1.png from the vanilla Bedrock resource pack and paste your custom sprites into the unused rows, or move your icons to an unused sheet like glyph_E2.png. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
