0

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

我喜欢打
篮球,我真的很喜欢
玩电脑
游戏

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

我喜欢打
篮球,我真的很
喜欢玩
电脑游戏

短词放在下一行,但较长的词分成两行,并用 - 连接,这样我可以显示比将每个单词放在新行上更多的文本。我对此的主要斗争是角色以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 个字符)用 - 和一部分在一行,另一部分在下一行(如最后一个示例)?

4

3 回答 3

1

这个问题被称为断字,它不是微不足道的。MS Word 等文本编辑器也具有此功能,请参阅https://practicaltypography.com/hyphenation.html

存在连字符算法(https://en.wikipedia.org/wiki/Hyphenation_algorithm),例如Knuth-Liang算法,Donald Knuth 写了著名的 TeX(https://en.wikipedia.org/wiki/TeX

c#中的断字

最好的自动换行算法?

C 中有一些库,例如https://github.com/hunspell/hyphen,它们也非常复杂。如果您找到更简单的解决方案,可以使用搜索词“连字符”搜索网络。一般问题很复杂(音节检测,...)

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

于 2020-04-05T06:00:33.727 回答
0

你会改变

tft.write(myFile.read());

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

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

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

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

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

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

快速 br-

自己的狐狸跳-

编辑在 sl-

哦,懒狗。

四个sco-

re和s-

甚至是-

耳前

我们的-

父亲

继续

这个新

继续

耳鼻喉科

于 2021-02-26T06:37:36.517 回答