It's more complicated than that, too. (But just about every terminal I've ever used at one point or another has made that buggy assumption!) Emoji and wide CJK characters typically take two terminal cells.
For example (and HN will corrupt the output of this command, as it will remove the emoji):
» python3 -c 'print("1234567890\n\N{PILE OF POO}x\u4e09x")'
1234567890
x三x
The second "x" should align under the 6. 4 glyphs, 6 cells.(I am a bit curious about the subpixel stuff. I've done font atlases, but IME Harfbuzz — the shaping engine I've used — only seems to emit integral advances? (Although I'm now wanting to re-test that assumption.) And I'm not entirely sure I know how to ask FreeType to render a glyph with an offset, either.)