我正在尝试创建一个有效的算法,用于缩短QString,因此当转换为UTF-8时,它将比定义的长度短并且仍然是有效的UTF-8。
首先我们从以下代码开始,但是这可能会在中间删除UTF-8字符,这是不可接受的:
QByteArray output = text.toUtf8().left(limit);
比我们开发的正确算法有效,但是非常难看且效率不高:
QString tmp = input;
while (tmp.toUtf8().size() > limit)
tmp.chop(1);
QByteArray output = tmp.toUtf8();
答案 0 :(得分:1)
除非您想编写自己的UTF-8转换例程,否则以下方法应该是最佳的。它依赖于UTF-8序列中的连续字节在0x80-0xBF范围内的事实。从限制向后,它试图找到可以安全地拆分字符串的第一个起始字节。
QByteArray output = tmp.toUtf8();
if (output.size() > limit) {
int truncateAt = 0;
for (int i = limit; i > 0; i--) {
if ((output[i] & 0xC0) != 0x80) {
truncateAt = i;
break;
}
}
output.truncate(truncateAt);
}
由于UTF-8字节序列不超过4个字节,因此不应该进行4次以上的循环迭代才能找到正确的位置。