I don't think I have a SSD1306 to try it out with. I am fairly convinced that OLEDs don't know anything about fonts (unlike, e.g.: LCDs): it's all in the library, which assembles the image and then sends a bitmap to the display.
Using O2O with a SH1106 and the below
#include "u8g2/cppsrc/U8g2lib.h"
const unsigned int SH1106_addr = 0x3c;
U8G2_SH1106_128X64_NONAME_F_HW_I2C_LINUX u8g2(U8G2_R0);
int main(int main_argc, char *main_argv[])
{
u8g2.setI2CAddress(SH1106_addr);
u8g2.initDisplay();
u8g2.setPowerSave(0);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_10x20_tf);
u8g2.setFontRefHeightText();
u8g2.setFontPosTop();
u8g2.drawUTF8(0, 22, "è É ü ö é");
u8g2.sendBuffer();
return 0;
}
I get:

I get almost the same thing just slightly shifted pretending my SH1106 is an SSD1306. The two are actually pretty similar and depending on the library, treating one as the other may result in just a slight offset (e.g.: u8g2 that O2O uses) or complete confusion (e.g.: the library you are using):
#include "u8g2/cppsrc/U8g2lib.h"
const unsigned int SH1106_addr = 0x3c;
class U8G2_SSD1306_128X64_NONAME_F_HW_I2C_LINUX : public U8G2 {
public: U8G2_SSD1306_128X64_NONAME_F_HW_I2C_LINUX(const u8g2_cb_t *rotation) : U8G2() {
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, rotation, u8x8_byte_linux_i2c, u8x8_linux_i2c_delay);
}
};
U8G2_SSD1306_128X64_NONAME_F_HW_I2C_LINUX u8g2(U8G2_R0);
int main(int main_argc, char *main_argv[])
{
u8g2.setI2CAddress(SH1106_addr);
u8g2.initDisplay();
u8g2.setPowerSave(0);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_10x20_tf);
u8g2.setFontRefHeightText();
u8g2.setFontPosTop();
u8g2.drawUTF8(0, 22, "è É ü ö é");
u8g2.sendBuffer();
return 0;
}
Using the SSD1309 lines I sent you above gives me a "Remote I/O error", which I blame on the fact that I don't actually have an SSD1309.