QString :: split()和“\ r”,“\ n”和“\ r \ n”约定

时间:2012-04-27 09:38:06

标签: c++ qt

我了解QString::split应该用于从多行QStringList获取QString。但是如果我有一个文件并且我不知道它是来自Mac,Windows还是Unix,我不确定QString.split("\n")是否适用于所有情况。处理这种情况的最佳方法是什么?

2 个答案:

答案 0 :(得分:34)

如果删除空白行是可以接受的,您可以尝试:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);

只要找到任何换行符(换行符或回车符),就会拆分字符串。任何连续的换行符(例如\r\n\r\n\n\n)都将被视为多个分隔符,它们之间包含空白部分,将被跳过。

答案 1 :(得分:24)

Emanuele Bezzi's answer错过了几点。

在大多数情况下,将使用文本流读取从文本文件读取的字符串,该文本流会自动将操作系统的行尾表示转换为单个'\n'字符。因此,如果您要处理本机文本文件,'\n'应该是您需要担心的唯一分隔符。例如,如果您的程序在Windows系统上运行,以文本模式读取输入,则行结尾将标记为 in memory ,其中包含单个\n个字符;你永远不会看到文件中存在的"\r\n"对。

但有时您需要处理“外国”文本文件。

理想情况下,您应该在阅读之前将任何此类文件翻译为本地格式,这样可以避免此问题。只有翻译实用程序需要知道变体行结尾;其他一切只是处理文本。

但这并不总是可行的;有时您可能希望程序在POSIX系统(Linux,UNIX等)上运行时处理Windows文本文件,反之亦然。

POSIX系统上的Windows格式文本文件在每行末尾会显示额外的'\r'个字符。

Windows系统上的POSIX格式文本文件似乎包含一个非常长的行,其中嵌入了'\n'个字符。

最常用的方法是以二进制模式读取文件并明确处理行结尾。

我不熟悉QString.split,但我怀疑这个:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);

将忽略空行,这些行将显示为"\n\n""\r\n\r\n",具体取决于格式。空行是完全有效的文本数据;你不应该忽视它们,除非你确定这样做是有道理的。

如果您需要处理由"\n""\r\n""\r"分隔的文字输入,那么我认为是这样的:

QString.split(QRegExp("\n|\r\n|\r"));

会做这个工作。 (感谢parsley72的评论帮助我使用正则表达式语法。)

另一点:您可能不会遇到仅使用'\r'分隔行的文本文件。这是MacOS使用的格式,直到版本9.MaxOS X基于UNIX,它使用标准的UNIX样式'\n'行结尾(尽管它也可能容忍'\r'行结尾。