SSD1306 显示屏不显示变音符号

问题描述 投票:0回答:1

我正在尝试让德语元音变音 äÖÜäöü 和 ß 显示在标准 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 转换器。

arduino i2c arduino-esp32 adafruit
1个回答
0
投票

因此,在对 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.