gpt4 book ai didi

c++ - 如何有效地仅转换 UTF-8 字节数组中的下一个字符?

转载 作者:行者123 更新时间:2023-11-30 05:32:02 30 4
gpt4 key购买 nike

我有这段有效的代码:

QString qs = QString::fromUtf8(bp,ut).at(0);
QChar c(qs[0]);

其中 bp 是一个 QByteArray::const_pointerut 是 UTF-8 编码的 Unicode 代码点的最大预期长度.然后我从 QString qs 中获取第一个 QChar c。似乎应该有一种更有效的方法来简单地从 UTF-8 字节数组中获取下一个 QChar,而不必将任意数量的 QByteArray 转换为QString 然后只获取第一个 QChar

编辑 从下面的评论来看,很明显还没有人理解我的问题。所以我将从一些基础知识开始。 UTF-8 和 UTF-16 是世界标准 Unicode 的两种不同编码。用于通过 Internet 和 Unicode 文本文件传输的最常见和最受鼓励的 Unicode 编码是 UTF-8,它导致每个 Unicode 代码点在 UTF-8 编码中使用 1 到 4 个字节。另一方面,UTF-16 更便于处理程序内的字符。因此,绝大多数软件一直在这两种编码之间进行转换。 QChar 是从 0x00 到 0xffff 的所有 Unicode 代码点的更方便的 UTF-16 编码,它涵盖了迄今为止定义和常用的大多数语言和符号。代理对用于较高的 Unicode 代码点值。目前代理对的支持似乎有限,我对目前的问题不感兴趣。

当您将文本文件读入QPlainTextEdit 时,转换会在幕后自动完成。从 QByteArray 中读取 QString 也可以自动完成(前提是您的语言环境和编解码器设置设置为 UTF-8),或者可以使用 toUtf8() 显式完成或我上面代码中的 fromUtf8()。

另一个方向的转换可以隐式(在幕后)或使用以下代码显式有效地完成:

    ba += *si; // Depends on the UTF-8 codec

    ba += QString(*si).toUtf8(); // UTF-8 explicitly

其中 ba 是一个 QByteArraysiQString::const_iterator。它们的作用完全相同(假设编解码器设置为 UTF-8)。它们都将 QChar 中的下一个(one)字符转换为 QString 中指向的字符,从而在 ba 中附加一个或多个字节

我想做的就是一次只对一个字符进行高效的逆向转换。在内部,这是针对每个要转换的字符完成的,而且我确信它正在非常有效地完成。

QString::fromUtf8(p,n) 的问题是 n 是要处理的 bytes 的数量而不是数量要转换的字符。因此,您必须允许最大字节数,可能是 3 个(如果它实际处理了代理项对,则为 4 个)。因此,如果您只需要下一个字符,则必须准备好处理几个字节,如果结果是一个具有多个字符的 QString,它们会被转换然后被丢弃。

问:是否有一次转换一个字符的转换函数?

最佳答案

您想使用 QTextDecoder .

根据文档,它是:

The QTextDecoder class provides a state-based decoder. A text decoder converts text from an encoded text format into Unicode using a specific codec. The decoder converts text in this format into Unicode, remembering any state that is required between calls.

这里重要的是状态。 QString 和 QTextCodec 是无状态的,因此它们处理整个字符串,从头到尾。

另一方面,QTextDecoder 允许您一次处理一个字节的字节缓冲区,在调用之间保持一种状态,以便调用者知道 UTF-8 序列是否仅被部分解码。

例如:

QTextDecoder decoder(QTextCodec::codecForName("UTF-8"));
QString result;
for (int i = 0; i < bytearray.size(); i++) {
result = decoder.toUnicode(bytearray.constData() + i, 1);
if (!result.isEmpty()) {
break; // we got our character !
}
}

此循环背后的基本原理是,只要解码器无法解码完整的 UTF-8 字符,它就会返回一个空字符串。

一旦可以,结果字符串将包含一个已解码的 unicode 字符。

这个循环是尽可能高效的,通过记住循环索引,可以用同样的方式得到下一个字符。

关于c++ - 如何有效地仅转换 UTF-8 字节数组中的下一个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35293615/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com