Character encoding (Generation III)
The Generation III games use a proprietary character encoding to store text data. The Generation III encoding is greatly different from the encodings used in previous generations, with characters corresponding to different bytes. Versions of the games in different languages may use different encodings, some more different than others.
Some text strings are stored in fixed-length structures while others are stored in a block of text with separate strings simply terminated by 0xFF. In the large, variable-length blocks, usually another structure will have pointers to the appropriate string(s) within that block of text. In the fixed-length structures, strings are still terminated by 0xFF, but any remainder of the allotted space is padded out with 0x00.
Compatibility
Unlike previous generations, all language versions are able to trade or battle across languages. This includes between Japanese games and Western games, which was not previously supported. Due to the encodings mostly being compatible, when trading Pokémon between different languages, nicknames and Original Trainer names are usually displayed correctly, though Japanese games will only display the first five characters of names longer than five characters.
All of the core series games for the Game Boy Advance and the side series games for the Nintendo GameCube losslessly preserve the codepoints used in Trainer names and Pokémon nicknames when traded, so they will be correctly displayed if returned to a game of the same language as its language of origin, even if it may appear truncated or be displayed differently.
Nintendo GameCube
- Main article: GameCube character encoding (Generation III)
When viewing or storing a Pokémon in Pokémon Box Ruby & Sapphire or trading a Pokémon between the Game Boy Advance games and Pokémon Colosseum and XD, its nickname and Original Trainer need to be transcoded between this character encoding and that of the Nintendo GameCube game.
Pal Park
- Main article: Pal Park → Nicknames and Original Trainers
When transferring a Pokémon to a Generation IV game via Pal Park, its nickname and Original Trainer need to be transcoded from this character encoding to that of the Generation IV games. Due to a bug, some accented letters that normally cannot be entered by the player are incorrectly turned into a kana character instead.
Character sets
Every Western game in Generation III (English, French, Italian, German, and Spanish games) contains two character sets: their native set and the Japanese set. The different Western character sets are mostly identical, with only a few regional differences.
For most text, the game's native character set is used, but if a Pokémon's origin language is Japanese, its nickname and its Original Trainer's name use the Japanese character set. The Japanese games only have the Japanese character set, but almost all user-enterable characters from the Western versions are encoded to roughly equivalent characters in the Japanese encoding. The key differences are 0xB8
(a comma in the Western versions but a period in Japanese), 0xAE
(a hyphen-minus in the Western versions but a chōonpu in Japanese, which is visually similar), and 0xAD
and 0xB0
-0xB4
(which display as the Japanese equivalents of the Western characters).
Western
The table below shows the English character set in Pokémon Emerald. Some differences do exist between different revisions and games and between different languages, detailed afterward.
Characters on a white background are the only characters that can be input in names; 0xF1
- 0xF6
are only available for input in German games. Those on a light gray background may be used in other text strings (such as dialogue) depending on the language of the game. Characters on a dark gray background are unused values that mostly display as spaces in Pokémon FireRed, LeafGreen, and Emerald; in Pokémon Ruby and Sapphire, they are holdovers from the Japanese encoding.
-0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | -8 | -9 | -A | -B | -C | -D | -E | -F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0- | À | Á | Â | Ç | È | É | Ê | Ë | Ì | Î | Ï | Ò | Ó | Ô | ||
1- | Œ | Ù | Ú | Û | Ñ | ß | à | á | ç | è | é | ê | ë | ì | ||
2- | î | ï | ò | ó | ô | œ | ù | ú | û | ñ | º | ª | ᵉʳ | & | + | |
3- | Lv
|
= | ; | |||||||||||||
4- | ||||||||||||||||
5- | ▯ | ¿ | ¡ | PK | MN | ![]() |
![]() |
Í | % | ( | ) | |||||
6- | â | í | ||||||||||||||
7- | ↑ | ↓ | ← | → | * | * | * | |||||||||
8- | * | * | * | * | ᵉ | < | > | |||||||||
9- | ||||||||||||||||
A- | ʳᵉ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ! | ? | . | - | ・ |
B- | ‥ | “
|
”
|
‘ | ' | ♂ | ♀ | $ | , | × | / | A | B | C | D | E |
C- | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U |
D- | V | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k |
E- | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | ► |
F- | : | Ä | Ö | Ü | ä | ö | ü | Control characters |
Differences between games and revisions
Codepoint 0xB0
represents an ellipsis. In Pokémon Ruby, Sapphire, Colosseum, XD, and Box Ruby & Sapphire, it renders as a two-dot ellipsis (‥
). In Pokémon FireRed, LeafGreen, and Emerald, it renders as a three-dot ellipsis (…
) in the main font, but remains a two-dot ellipsis in the small font used on the party screen and the narrow font used in the Pokédex, bag, and shops. In subsequent generations, this character renders consistently as a three-dot ellipsis.
Codepoint 0xB0
represents an apostrophe or right single quotation mark. In Pokémon Box Ruby & Sapphire, it is transcoded as a curly right single quotation mark (’
). In Pokémon Colosseum and XD, it is transcoded as a straight apostrophe ('
).
Codepoints 0x7D
-0x83
, marked by asterisks (*) above, print spaces 1-7 pixels wide (in ascending order of the hex value). In FireRed and LeafGreen, 0x50
and 0x7D
-0x83
are not used and print as regular spaces like other unused characters.
In certain languages, codepoints 0x34
, 0x57
-0x59
, and 0x64
differ between games, as detailed below.
In Pokémon Ruby and Sapphire, many values print Japanese characters—holdovers from the original Japanese encoding. These include:
- All unused characters (on a dark gray background above)
0x50
and0x7D
-0x83
0x36
,0x84
-0x86
, and0xA0
, in version 1.0 of the English Ruby and Sapphire only
Regional differences
A few characters differ between regions, and among them are quotation marks. These can be input into names, which means a Pokémon with quotation marks in its nickname or OT name will display differently if traded to a game of a different region.
In the table below, the underscores (_
) stand for spaces.
English | Spanish | Italian | German | French | |
---|---|---|---|---|---|
0x34
|
Lv | NvRS Nv.EFRLG |
L. | Lv. | N. |
0x57 - 0x59
|
![]() ![]() ![]() |
![]() ![]() ![]() |
_, _, MRS _, _, _EFRLG |
![]() ![]() ![]() |
![]() ![]() ![]() |
0x5E - 0x63
|
![]() ![]() ![]() ![]() ![]() ![]() |
||||
0x64
|
PcoE | ||||
0xB1
|
“ | „ | « | ||
0xB2
|
” | “ | » |
Japanese
Only the characters on a white background below can be input in names. The characters on a dark gray background are printed as spaces in Pokémon FireRed, LeafGreen, and Emerald. Otherwise, the Japanese character set has no differences between games or revisions. Codepoint 0xB0
represents an ellipsis. In Pokémon Ruby, Sapphire, Emerald, Colosseum, XD, and Box Ruby & Sapphire, it renders as a two-dot ellipsis (‥
). In Pokémon FireRed and LeafGreen, it renders as a three-dot ellipsis (…
). In subsequent generations, this character renders consistently as a three-dot ellipsis.
-0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | -8 | -9 | -A | -B | -C | -D | -E | -F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0- | あ | い | う | え | お | か | き | く | け | こ | さ | し | す | せ | そ | |
1- | た | ち | つ | て | と | な | に | ぬ | ね | の | は | ひ | ふ | へ | ほ | ま |
2- | み | む | め | も | や | ゆ | よ | ら | り | る | れ | ろ | わ | を | ん | ぁ |
3- | ぃ | ぅ | ぇ | ぉ | ゃ | ゅ | ょ | が | ぎ | ぐ | げ | ご | ざ | じ | ず | ぜ |
4- | ぞ | だ | ぢ | づ | で | ど | ば | び | ぶ | べ | ぼ | ぱ | ぴ | ぷ | ぺ | ぽ |
5- | っ | ア | イ | ウ | エ | オ | カ | キ | ク | ケ | コ | サ | シ | ス | セ | ソ |
6- | タ | チ | ツ | テ | ト | ナ | ニ | ヌ | ネ | ノ | ハ | ヒ | フ | ヘ | ホ | マ |
7- | ミ | ム | メ | モ | ヤ | ユ | ヨ | ラ | リ | ル | レ | ロ | ワ | ヲ | ン | ァ |
8- | ィ | ゥ | ェ | ォ | ャ | ュ | ョ | ガ | ギ | グ | ゲ | ゴ | ザ | ジ | ズ | ゼ |
9- | ゾ | ダ | ヂ | ヅ | デ | ド | バ | ビ | ブ | ベ | ボ | パ | ピ | プ | ペ | ポ |
A- | ッ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ! | ? | 。 | ー | ・ |
B- | ‥ | 『 | 』 | 「 | 」 | ♂ | ♀ | 円 | . | × | / | A | B | C | D | E |
C- | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U |
D- | V | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k |
E- | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | ► |
F- | : | Ä | Ö | Ü | ä | ö | ü | ↑ | ↓ | ← | Control characters |
Control characters
- 0xF7 is an escape character for dynamic data.FRLGE
- 0xF8 is an escape character for keypad icons.FRLGE
- 0xF9 is an escape character for extra symbols.FRLGE
- 0xFA and 0xFB both mark a prompt for the player to press a button to continue the dialogue. However, they will print the new line of dialogue differently: 0xFA will scroll the previous dialogue up one line before printing the next line, while 0xFB will clear the dialogue box entirely.
- 0xFC is an escape character that leads to several different functions (see below).
- 0xFD is an escape character for variables, such as the player's name or a Pokémon's name (see below).
- 0xFE is a line break.
- 0xFF is a terminator, marking the ends of strings.
0xFC functions
When 0xFC is followed by...
- 0x01, it will change the color of the text, depending on the byte following. The available colors are listed below.
- 0x02, the text will be highlighted, depending on the byte following. The available colors are listed below.
- 0x03, the text's shadow will have its color changed, depending on the byte following. The available colors are listed below.
- 0x04, the text will be colored and highlighted. The byte immediately following determines the text's color, while a second byte afterward will determine the highlight color. The available colors are listed below.
- 0x06, the text will change size, depending on the byte following. 0x00 will make the font smaller, while anything else will make the font the default size.
- 0x08 and another byte, it produces a pause in the text. The byte after 0x08 determines the length of the pause.
- 0x09, the game will pause text display, and resume upon pressing a button.
- 0x0C, it will escape the byte that follows 0x0C if it is a control character and print a new character. If the second byte after 0xFC is not a control character byte, that byte prints normally.
- When the third byte is 0xFA, "→" is produced.
- When the third byte is 0xFB, "+" is produced (though in the Japanese games, within the Options screen, it produces "=").
- The other control characters do not produce any characters. In the English games, nothing is printed, while in the Japanese games, miscellaneous data appears to be printed.
- 0x0D, the text will be shifted by a certain amount of pixels, depending on the byte following this one. The effect wears off upon entering a new line.
- 0x10, music will begin to play. Music is specified by the two bytes following, in little endian format.
- 0x15, text will be rendered in the Japanese font
- 0x16, text will be rendered in the International font
- 0x17, music will be paused.
- 0x18, music will resume playing.
Color values
A table of available text, highlight, and shadow colors is shown below.
Byte | RS | FRLG | E |
---|---|---|---|
0x00 | Transparent | ||
0x01 | |||
0x02 | |||
0x03 | |||
0x04 | |||
0x05 | |||
0x06 | |||
0x07 | |||
0x08 | |||
0x09 | |||
0x0A | |||
0x0B | |||
0x0C | |||
0x0D | |||
0x0E | |||
0x0F |
0xFD variables
When 0xFD is followed by one of the following bytes, it prints a text variable or version-dependent text. Version-dependent text is only used in Pokémon Ruby, Sapphire, and Emerald; in Pokémon Emerald, all of these values are the same as Pokémon Sapphire, except the version name. The text printed by version-dependent text variables is constant within a single game, but varies between versions and languages.
- Text variables
- 0x01: the player's name
- 0x02, 0x03, or 0x04: whatever text has been assigned to one of three buffers using a variety of script commands
- 0x05: an honorific corresponding to the player's gender in Japanese (
くん
for male,ちゃん
for female), or nothing in Western languages - 0x06: the rival's name
- Version-dependent text
Variable ID | Description | English content | ||||
---|---|---|---|---|---|---|
R | S | E | ||||
0x07 | the game's name | RUBY | SAPPHIRE | EMERALD | ||
0x08 | the name of the villainous team | MAGMA | AQUA | |||
0x09 | the name of the non-villainous team | AQUA | MAGMA | |||
0x0A | the name of the villainous team's leader | MAXIE | ARCHIE | |||
0x0B | the name of the non-villainous team's leader | ARCHIE | MAXIE | |||
0x0C | the name of the villainous team's Legendary Pokémon | GROUDON | KYOGRE | |||
0x0D | the name of the opposing Legendary Pokémon | KYOGRE | GROUDON |
Trivia
- In the name field for Eggs, the game places the bytes
0x60 0x6F 0x8B
corresponding to タマゴ (tamago, the Japanese word for egg). This remains in the English version even though the characters have been replaced.
|
![]() |
This data structure article is part of Project Games, a Bulbapedia project that aims to write comprehensive articles on the Pokémon games. |