【问题标题】:How to make a word processor in Arduino (C/C++) where the text is coming character by character?如何在 Arduino (C/C++) 中制作文字处理器,其中文本逐个字符出现?
【发布时间】:2020-07-17 04:40:29
【问题描述】:

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

我喜欢打篮球
tball,我真的很喜欢
玩计算机
r 游戏

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

我喜欢晒太阳-
etball,我真的
喜欢玩电脑-
超级游戏

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

【问题讨论】:

  • 请注意,没有“C/C++”语言。两者是不同的语言。 Arduino 代码是 C++。

标签: c++ text arduino word-processor


【解决方案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)

Hyphenation in c#

Best word wrap algorithm?

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

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

【讨论】:

    【解决方案2】:

    你会改变

    tft.write(myFile.read());
    

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      快速 br-

      自己的狐狸跳-

      在SL-

      哎呀懒狗。

      四个范围-

      re 和 s-

      即使是-

      很久以前

      我们的-

      父亲

      设置

      继续

      这个新的

      继续-

      ent

      【讨论】:

        猜你喜欢
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        • 2010-11-25
        • 1970-01-01
        相关资源
        最近更新 更多