将 QStringList 打包成 QString 并解压回来

Pack QStringList to QString and unpack it back

我正在寻找一种简单且万无一失的方法来将任意 QStringList 转换为单个 QString 并返回。

QStringList fruits;
fruits << "Banana", "Apple", "Orange";
QString packedFruits = pack(fruits);
QStringList unpackFruits = unpack(packedFruits);

// Should be true 
// fruits == unpackFruits;

对于此类问题,最简单的解决方案可能是什么?

QStringListQString - QStringList::join:

Joins all the string list's strings into a single string with each element separated by the given separator (which can be an empty string).

QString pack(QStringList const& list)
{
    return list.join(reserved_separator);
}

QStringQStringList - QString::split:

Splits the string into substrings wherever sep occurs, and returns the list of those strings. If sep does not match anywhere in the string, split() returns a single-element list containing this string.

QStringList unpack(QString const& string)
{
    return string.split(reserved_separator);
}

使用QStringList::join()

QStringList strList;
strList << "Banana" << "Apple" << "Orange" ;

QString str = strList.join("");  // str = "BananaAppleOrange";
str = strList.join(",");  // str = "Banana,Apple,Orange";

之前的答案提到了 QString::splitQStringList::join 这是正确的方法,但是如果您选择的分隔符包含在任何字符串中,它将破坏您的转换。

您必须使用以下技术之一防止列表中的字符串包含您的分隔符:

  • 如果任何字符串包含分隔符
  • ,则在 QStringList::join 之前抛出错误
  • 确保它们不能包含分隔符(例如存储字符串及其 QByteArray::toHex(myString.toLatin1()) 表示,然后使用具有 0..9 和 a..f 范围之外的字符的分隔符. 然后用 QString::fromLatin1(QByteArray::fromHex(myHexString)) 转换回来
  • 使用任何分隔符,无论字符串是否包含它,但在 join() 之前为其实现转义逻辑,并在 split() 之后实现非转义逻辑,以便分隔符永远不会出现在任何字符串中连接时的字符串,但它的所有实例都将被恢复。