Empty on WindowsUppercase E with acute accent
ASCII 144 is empty on Windows and É in old DOS.
Byte 144 (0x90) is unassigned in Windows-1252 as well. Cyrillic text is one way to hit it: UTF-8 stores capital А as D0 90, so a Russian or Ukrainian name like Анна, read as Windows-1252, gives Ð followed by a byte the table can't map, and a strict decoder stops right there. The Ð is the tell. Every Cyrillic letter from А to п starts with D0 in UTF-8, which is why misread Cyrillic is dense with it, as in Привіт for Привіт.
É (Capital E with Acute) is byte 144 in code page 437, the original IBM PC character set, and maps to Unicode U+00C9. Windows-1252 leaves byte 144 unassigned, so French DOS text read as Windows-1252 drops the letter or turns it into an invisible control code, and École comes out as cole. Code page 850 kept É at 144 too. Small é is 130 in DOS.
/* Byte 144 (0x90) has no character in Windows-1252.MultiByteToWideChar passes it through as the control code U+0090,so treat it as a sign that the text is not really Windows-1252. */unsigned char b = 144;char c = (char)144; /* -112 on x86, where char is signed */
#include <stdio.h>int main(void) {/* Byte 144 is É only on a console using code page 437(chcp 437 on Windows, or DOSBox). On a UTF-8 terminal thelone byte 0x90 is invalid and prints as garbage, often �. */putchar(144);/* char is signed on x86, so a plain char holding 0x90 is -112.Use unsigned char when you compare or index by byte value. */char c = (char)144;unsigned char u = 144;printf("\n%d %d\n", c, u); /* -112 144 *//* Portable: print the Unicode character as UTF-8 instead. */printf("\u00C9\n"); /* C3 89 */return 0;}
É is also ASCII 201 on Windows, which has the full guide.
A UTF-8 file is being read as Windows-1252, and 0x90 is one of its empty slots. Animal emoji are a common trigger, because 🐶, 🐱 and the rest of the U+1F400 range all start with F0 9F 90, and so is Cyrillic capital А, stored as D0 90. If the error comes from a library you can't change, start Python with `python -X utf8`, which makes UTF-8 the default for every open() call in the process.
DOS keeps É at byte 144, one of the five slots Windows-1252 leaves empty, so a Windows reader drops it or leaves an invisible control code. Lowercase é survives as ‚, which gives the mix-up away: École élémentaire turns into cole ‚l‚mentaire. In Kotlin, `File("old.txt").readText(Charset.forName("IBM850"))` reads it correctly.