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



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

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

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

我喜欢玩篮球
etball,我真的
喜欢玩comp-
uter游戏

将短单词放在下一行,但将长单词拆分为两行并用-连接,这将使我能够显示比将每个单词放在新行多得多的文本。我对此的主要挣扎是,角色们以这样的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),例如Knuth Liang算法,Donald Knuth写了著名的TeX(https://en.wikipedia.org/wiki/TeX)

c#中的断字

最佳换行算法?

C中有类似的库https://github.com/hunspell/hyphen它们也非常复杂。如果你找到一个更简单的解决方案,可以用搜索词"连字符"在网上搜索。一般来说,问题是复杂的(音节检测,…(

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

您将更改

tft.write(myFile.read());

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

如果Arduino上的内存不足,无法进行完整的连字符库

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

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

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

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

快速br-

自己的狐狸跳跃-

通过sl-

噢,懒狗。

四sco-

re和s-

偶数y-

几年前

我们的

默认

设置

在上

这个新的

contin-

ent

最新更新