如何在 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 上的内存不足以容纳完整的断字库
- 根据文本的来源,如果文本始终显示在同一列中,您可以在文本文件中手动进行连字(并用空格填充行)或
- 您可以预先半自动标记所有位置,其中可以连字符。算法只是删除中间字符串中的这些标记或用换行符替换它们
- 有一些简化的断字库可以找到不是所有的断字位置,但比没有断字要好得多
最简单的断字算法(假设是学校英语)是在适合该行的最后一个辅音*处断开一个单词。但这需要多个步骤:
- 一次将字母放在一行一个单词(标点符号*之间)
- 检测行的字符数限制
- 后退到辅音或标点符号。
我在上面用星号* 表示了列表。
标点符号:space、连字符、撇号、引号(你能干净地转义引号吗?)、一般标点符号
辅音:容易列出
快速br-
自己的狐狸跳-
ed 在 sl-
好懒的狗。
四个sco-
re 和 s-
偶数y-
很久以前
我们的-
父亲
设置
第四次
这个新的
继续-
进入
我正在使用 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 上的内存不足以容纳完整的断字库
- 根据文本的来源,如果文本始终显示在同一列中,您可以在文本文件中手动进行连字(并用空格填充行)或
- 您可以预先半自动标记所有位置,其中可以连字符。算法只是删除中间字符串中的这些标记或用换行符替换它们
- 有一些简化的断字库可以找到不是所有的断字位置,但比没有断字要好得多
最简单的断字算法(假设是学校英语)是在适合该行的最后一个辅音*处断开一个单词。但这需要多个步骤:
- 一次将字母放在一行一个单词(标点符号*之间)
- 检测行的字符数限制
- 后退到辅音或标点符号。
我在上面用星号* 表示了列表。 标点符号:space、连字符、撇号、引号(你能干净地转义引号吗?)、一般标点符号 辅音:容易列出
快速br-
自己的狐狸跳-
ed 在 sl-
好懒的狗。
四个sco-
re 和 s-
偶数y-
很久以前
我们的-
父亲
设置
第四次
这个新的
继续-
进入