如何在 Arduino (C/C++) 中制作文字处理器,其中文本逐字符出现?

How to make a word processor in Arduino (C/C++) where the text is coming character by character?

我正在使用 Adafruit_ST7735(带有 Adafruit_GFX)库在我的 1.8 TFT 显示器上显示内容。当我设置 tft.setTextWrap(false); 它确实换行了文本,但它不关心单词。例如,它像这样包装它:

I like to play baske
tball and I really lik
e to play compute
r games

我需要让它看起来像这样:

I like to play bask-
etball and I really
like to play comp-
uter games

短词放在下一行,但较长的词分成两行,用 - 连接,这样我可以显示比将每个词放在新行上更多的文本。我对此的主要挣扎是角色以这样的 SD 方式一个接一个地出现:

File myFile = SD.open(file_name);
if (myFile) {
  while (myFile.available() > myFile.size() - 300) {
    tft.write(myFile.read());
  }
  myFile.close();
} else {
  tft.print("Error opening file.");
}

我将如何为传入的字符编写这样的文字处理器,以便将短词(即包含少于或等于 5 个字符)转移到下一行,而较长的词(即包含多于 5 个字符)得到用 - 剪切,一部分在一行,另一部分在下一行(如上一个示例)?

这个问题叫做连字符,它不简单。 MS Word 等文本编辑器也有此功能,请参阅 https://practicaltypography.com/hyphenation.html

存在断字算法(https://en.wikipedia.org/wiki/Hyphenation_algorithm), e.g. Knuth-Liang algorithm, Donald Knuth wrote the famous TeX (https://en.wikipedia.org/wiki/TeX

Hyphenation in c#

Best word wrap algorithm?

https://github.com/hunspell/hyphen 这样的 C 语言库也非常复杂。如果您找到更简单的解决方案,可以使用搜索词 'hyphenation' 搜索网络。总的来说这个问题很复杂(音节检测,...)

我认为最简单的解决方案是完全跳过连字符并使用空格来分隔单词(在任何单词之间的句子中都是空格...)

你会改变

tft.write(myFile.read());

读入中间字符串,在其中进行连字。

如果您的 Arduino 上的内存不足以容纳完整的断字库

  • 根据文本的来源,如果文本始终显示在同一列中,您可以在文本文件中手动进行连字(并用空格填充行)或
  • 您可以预先半自动标记所有位置,其中可以连字符。算法只是删除中间字符串中的这些标记或用换行符替换它们
  • 有一些简化的断字库可以找到不是所有的断字位置,但比没有断字要好得多

最简单的断字算法(假设是学校英语)是在适合该行的最后一个辅音*处断开一个单词。但这需要多个步骤:

  1. 一次将字母放在一行一个单词(标点符号*之间)
  2. 检测行的字符数限制
  3. 后退到辅音或标点符号。

我在上面用星号* 表示了列表。 标点符号:space、连字符、撇号、引号(你能干净地转义引号吗?)、一般标点符号 辅音:容易列出

快速br-

自己的狐狸跳-

ed 在 sl-

好懒的狗。

四个sco-

re 和 s-

偶数y-

很久以前

我们的-

父亲

设置

第四次

这个新的

继续-

进入