在Qt中编码/解码某些文本序列

时间:2013-04-25 23:45:22

标签: c++ qt encoding qt4

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

以此为例:

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

如果用户在myTextEdit的文本中写了序列\n,我希望MAGIC_TRANSLATE将字符串\n转换为实际的新行字符。

同样地,如果我在其中添加一个新行的文字,MAGIC_UNTRANSLATE会将换行符转换为\n字符串。

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

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

\foo -> FOO
\foobar -> FOOBAR
在翻译文本asd \foobar lol时,

可能会产生问题,因为如果在\foo之前搜索并替换了\foobar,那么生成的文本将是asd FOObar lol而不是asd FOOBAR lol (更自然){{1}}。

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

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

编辑: 顺便说一句,在我看来是一种基于数据的方法,基于资源或外部文件或任何不需要重新编译的东西都会很棒。

2 个答案:

答案 0 :(得分:0)

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

首先,您需要准确地计算出您的映射。如你所说,如果您的转义序列如\ foo和\ foobar是繁琐的,您可能会发现您没有双向无损映射。如果您的设计或编码存在缺陷,世界上没有图书馆可以帮助您。

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

答案 1 :(得分:0)

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

根据尼古拉斯的回答,一个好的策略是使用替代品。在大多数情况下,它很简单有效,例如在普通的C / C ++转义中:

\n \r \t etc

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

例如,如果你的序列是上面的一个加上一些希腊字母,你就不会喜欢\nu序列,它应该被翻译成ν

相反,如果替换函数在\n之前测试\nu,则结果是错误的。

假设两个序列将在两个完全不同的实体中进行转换,则有两种解决方案:放置一个紧密序列字符,例如\nu;,或者只用最长到较短的字符串替换。这可以确保任何前一个序列都不会被替换。

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

正则表达式是状态机,重新处理输入并不罕见,使用trie,你可以避免两次重新匹配字符,所以你的速度非常快。

尝试代码很容易在互联网上找到,并且进行高效匹配的修改是微不足道的,所以我不会在这里编写代码。