5#ifndef QSTRINGCONVERTER_P_H
6#define QSTRINGCONVERTER_P_H
19#include <QtCore/qstring.h>
20#include <QtCore/qendian.h>
21#include <QtCore/qstringconverter.h>
22#include <QtCore/private/qglobal_p.h>
39 char16_t *
dst =
reinterpret_cast<char16_t *
>(
buffer);
41 return reinterpret_cast<QChar *
>(
dst);
100 { *
ptr++ = char16_t(uc); }
116 { *
ptr++ = char32_t(uc); }
133 template <
typename Traits,
typename OutputPtr,
typename InputPtr>
inline
136 if (!Traits::skipAsciiHandling && u < 0x80) {
140 }
else if (u < 0x0800) {
143 Traits::appendByte(
dst, 0xc0 |
uchar(u >> 6));
145 if (!QChar::isSurrogate(u)) {
147 if (!Traits::allowNonCharacters && QChar::isNonCharacter(u))
148 return Traits::Error;
151 Traits::appendByte(
dst, 0xe0 |
uchar(u >> 12));
155 if (Traits::availableUtf16(
src,
end) == 0)
156 return Traits::EndOfString;
158 char16_t low = Traits::peekUtf16(
src);
159 if (!QChar::isHighSurrogate(u))
160 return Traits::Error;
161 if (!QChar::isLowSurrogate(low))
162 return Traits::Error;
164 Traits::advanceUtf16(
src);
165 char32_t ucs4 = QChar::surrogateToUcs4(u, low);
167 if (!Traits::allowNonCharacters && QChar::isNonCharacter(ucs4))
168 return Traits::Error;
171 Traits::appendByte(
dst, 0xf0 | (
uchar(ucs4 >> 18) & 0xf));
174 Traits::appendByte(
dst, 0x80 | (
uchar(ucs4 >> 12) & 0x3f));
181 Traits::appendByte(
dst, 0x80 | (
uchar(u >> 6) & 0x3f));
185 Traits::appendByte(
dst, 0x80 | (u & 0x3f));
191 return (
b & 0xc0) == 0x80;
196 template <
typename Traits,
typename OutputPtr,
typename InputPtr>
inline
203 if (!Traits::skipAsciiHandling &&
b < 0x80) {
205 Traits::appendUtf16(
dst,
b);
212 return Traits::Error;
213 }
else if (
b < 0xe0) {
217 }
else if (
b < 0xf0) {
221 }
else if (
b < 0xf5) {
229 return Traits::Error;
233 if (
Q_UNLIKELY(bytesAvailable < charsNeeded - 1)) {
236 return Traits::Error;
238 return Traits::Error;
239 return Traits::EndOfString;
243 b = Traits::peekByte(
src, 0);
245 return Traits::Error;
249 if (charsNeeded > 2) {
251 b = Traits::peekByte(
src, 1);
253 return Traits::Error;
257 if (charsNeeded > 3) {
259 b = Traits::peekByte(
src, 2);
261 return Traits::Error;
268 if (!Traits::isTrusted) {
270 return Traits::Error;
271 if (QChar::isSurrogate(uc) || uc > QChar::LastValidCodePoint)
272 return Traits::Error;
273 if (!Traits::allowNonCharacters && QChar::isNonCharacter(uc))
274 return Traits::Error;
278 if (!QChar::requiresSurrogates(uc)) {
281 Traits::appendUtf16(
dst,
char16_t(uc));
284 Traits::appendUcs4(
dst, uc);
287 Traits::advanceByte(
src, charsNeeded - 1);
303 char16_t *
dst =
reinterpret_cast<char16_t *
>(
buffer);
305 return reinterpret_cast<QChar *
>(
dst);
314 char16_t *
buffer =
reinterpret_cast<char16_t *
>(
out);
356#if !defined(Q_OS_WIN) || defined(QT_BOOTSTRAPPED)
362 static int checkUtf8();
366 static QBasicAtomicInteger<qint8>
result = { 0 };
380 return convertToUnicode_sys(
in,
state);
388 return convertFromUnicode_sys(
in,
state);
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
qsizetype fromUtf8(uchar b, OutputPtr &dst, InputPtr &src, InputPtr end)
int toUtf8(char16_t u, OutputPtr &dst, InputPtr &src, InputPtr end)
bool isContinuationByte(uchar b)
static ControlElement< T > * ptr(QWidget *widget)
GLboolean GLboolean GLboolean b
static QString convertToUnicode(const QString &asciiDomain, QUrl::AceProcessingOptions options)
QTextStream out(stdout)
[7]
static char16_t * convertToUnicode(char16_t *dst, QLatin1StringView in) noexcept
static QChar * convertToUnicode(QChar *dst, QByteArrayView in, QStringConverterBase::State *state) noexcept
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state) noexcept
static QChar * convertToUnicode(QChar *buffer, QLatin1StringView in) noexcept
static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state)
static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
static Q_CORE_EXPORT QString convertToUnicode(QByteArrayView, QStringConverter::State *, DataEndianness=DetectEndianness)
static Q_CORE_EXPORT QByteArray convertFromUnicode(QStringView, QStringConverter::State *, DataEndianness=DetectEndianness)
static Q_CORE_EXPORT QByteArray convertFromUnicode(QStringView, QStringConverter::State *, DataEndianness=DetectEndianness)
static QChar * convertToUnicode(QChar *out, QByteArrayView, QStringConverter::State *state, DataEndianness endian)
static const bool skipAsciiHandling
static void appendByte(qchar8_t *&ptr, qchar8_t b)
static uchar peekByte(const uchar *ptr, qsizetype n=0)
static qptrdiff availableBytes(const qchar8_t *ptr, const qchar8_t *end)
static void appendByte(uchar *&ptr, uchar b)
static void advanceByte(const uchar *&ptr, qsizetype n=1)
static const bool isTrusted
static void appendUtf16(char32_t *&ptr, char16_t uc)
static const bool skipAsciiHandling
static char16_t peekUtf16(const char16_t *ptr, qsizetype n=0)
static void appendUcs4(char16_t *&ptr, char32_t uc)
static const int EndOfString
static void advanceUtf16(const char16_t *&ptr, qsizetype n=1)
static uchar peekByte(const char *ptr, qsizetype n=0)
static void advanceByte(const char *&ptr, qsizetype n=1)
static uchar peekByte(const qchar8_t *ptr, qsizetype n=0)
static void appendUtf16(char16_t *&ptr, char16_t uc)
static const bool allowNonCharacters
static qptrdiff availableUtf16(const char16_t *ptr, const char16_t *end)
static qptrdiff availableBytes(const char *ptr, const char *end)
static void appendUcs4(char32_t *&ptr, char32_t uc)
static qptrdiff availableBytes(const uchar *ptr, const uchar *end)
static void advanceByte(const qchar8_t *&ptr, qsizetype n=1)
static Q_CORE_EXPORT QByteArray convertFromUnicode(QStringView in)
static int compareUtf8(QByteArrayView utf8, QStringView utf16, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
static QChar * convertToUnicode(QChar *buffer, QByteArrayView in) noexcept
static ValidUtf8Result isValidUtf8(QByteArrayView in)
static Q_CORE_EXPORT char * convertFromLatin1(char *out, QLatin1StringView in)
static QChar * convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state)