我正在尝试让德语元音变音 äÖÜäöü 和 ß 显示在标准 SSD1309 OLED 显示屏上。我使用 Adafruit GFX 字体定制器 来获取额外字母的字节代码。尝试显示字符后,仍然没有显示。 我尝试编写一个函数,用 Unicode 字符串替换字符。
这是我的 main.cpp 的一部分:
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.setFont(&FreeSans9pt7b_Umlaute);
display.println(F("ÖÄÜöäüß"));
display.display();
这是我的替换功能:
String utf8ToDisplay(const char* str) {
String result = "";
while (*str) {
if ((*str & 0x80) == 0) {
// ASCII character
result += *str;
} else if ((*str & 0xE0) == 0xC0) {
// 2-byte UTF-8 character
result += *str;
result += *(str + 1);
str++;
} else if ((*str & 0xF0) == 0xE0) {
// 3-byte UTF-8 character
result += *str;
result += *(str + 1);
result += *(str + 2);
str += 2;
}
str++;
}
return result;
}
我必须更改什么才能让我的代码使用新字符?
我的显示库是 Adafruit_GFX Adafruit_SSD1306
如果您想检查我的字体,您可以在此处获取它并将其上传到 Adafruit GFX 转换器。
因此,在对 utf8ToDisplay 函数进行一些修改之后,我发现我错误地处理了 2 字节和 3 字节 UTF-8 字符的转换。它可能不是最干净的解决方案,但该函数现在正在检查单个字符并将它们附加到结果中。
String utf8ToDisplay(const char* str) {
String result = "";
while (*str) {
if ((*str & 0x80) == 0) {
// ASCII character
result += *str;
} else if ((*str & 0xE0) == 0xC0) {
// 2-byte UTF-8 character
uint16_t unicode = ((*str & 0x1F) << 6) | (*(str + 1) & 0x3F);
if (unicode == 0xC4 || unicode == 0xD6 || unicode == 0xDC || unicode == 0xE4 || unicode == 0xF6 || unicode == 0xFC || unicode == 0xDF) {
result += (char)unicode;
}
str++;
} else if ((*str & 0xF0) == 0xE0) {
// 3-byte UTF-8 character
result += *str;
result += *(str + 1);
result += *(str + 2);
str += 2;
}
str++;
}
return result;
}