0

我有一个QTextEdit用户可以插入任意文本的地方。在本文中,可能有一些我希望自动翻译的特殊字符序列。从翻译版本中,我希望我能回到序列。

以这个为例:

QMessageBox::information(0, "Foo", MAGIC_TRANSLATE(myTextEdit->text()));

如果用户在myTextEdit's text 中写入了 sequence \n,我希望将MAGIC_TRANSLATE字符串转换\n为实际的换行符。

同样,如果我给出一个包含换行符的文本,aMAGIC_UNTRANSLATE会将换行符转换为\n字符串。

现在,我当然可以自己实现这两个功能,但我要问的是,在 Qt 中是否已经制作了一些易于使用的东西,它允许我指定一个字典,其余的工作会为我完成。

请注意,具有公共前缀的序列可能会产生一些冲突,例如转换:

\foo -> FOO
\foobar -> FOOBAR

翻译文本时可能会出现问题asd \foobar lol,因为如果\foo在之前搜索和替换\foobar,那么生成的文本将是asd FOObar lol而不是(更自然)asd FOOBAR lol

我希望已经明确了我的需求。我相信这可能是一个常见的任务,所以我希望有一个 Qt 解决方案可以在前缀冲突时考虑到这类问题。

如果这是一个微不足道的话题(我认为可能是这样),我很抱歉,但我对编码技术和问题一点也不熟悉,而且我对 Qt 编码的了解只涵盖了非常简单的与 Unicode 相关的问题。

编辑:顺便说一句,在我的情况下,基于资源或外部文件或任何不需要重新编译的面向数据的方法会很棒。

4

2 回答 2

0

听起来您的问题是,“我想运行一系列正则表达式或简单的字符串替换来映射某些文本的两种编码”。

首先,您需要准确地制定映射。正如您所说,如果您的转义序列(如 \foo 和 \foobar)很繁琐,您可能会发现您没有双向无损映射。如果您的设计或编码有缺陷,世界上没有任何图书馆可以帮助您。

当您最终得到一个精确的设计时(鉴于完全缺乏有关此功能目的的信息,我们无法帮助您),您可能会发现一系列字符串替换是好的。如果它真的更复杂,那么一些 QRegExps 应该就足够了。

于 2013-05-02T21:43:43.753 回答
0

自我回答问题总是有点难看,但是......也许这个解决方案对某人有用。

正如 Nicholas 在他的回答中所建议的那样,一个好的策略是使用替换。在大多数情况下它是简单而有效的,例如在普通的 C/C++ 转义中:

\n \r \t etc

这是有效的,因为它们都是不同的。如果序列都不同,特别是如果没有序列是另一个序列的前缀,它将始终与替换一起工作。

例如,如果您的序列是上述序列加上一些希腊字母,您将不喜欢该\nu序列,应将其翻译为ν.

相反,如果替换函数测试\nbefore \nu,结果是错误的。

假设两个序列都将被翻译成两个完全不同的实体,有两种解决方案:放置一个接近序列的字符,例如\nu;,或者只是用最长到较短的字符串替换。这确保了作为另一个前缀的任何序列不会在它之前被替换。

出于各种原因,我尝试了另一种方法:使用 trie,它是单词字典中所有前缀的树。长话短说:它工作得相当好,并且可能比(大多数)正则表达式和替换更快。

正则表达式是状态机,重新处理输入的情况并不少见,使用 trie,可以避免重新匹配字符两次,因此速度很快。

Try 的代码在网上很容易找到,而进行高效匹配的修改很简单,所以我不会在这里写代码。

于 2013-05-02T22:55:13.643 回答