X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fqstring_helpers.h;h=206d23948694693c48a5aee242e9f2ce08c307c1;hb=8711df9282463c658c2f1972414161430e7e64d8;hp=04940e478c338814a109c3d791e4344e041261c9;hpb=525e28f5205f8e7e267512c418985fc7e1a3c142;p=lyx.git diff --git a/src/support/qstring_helpers.h b/src/support/qstring_helpers.h index 04940e478c..206d239486 100644 --- a/src/support/qstring_helpers.h +++ b/src/support/qstring_helpers.h @@ -14,10 +14,8 @@ #include "support/docstring.h" -#include -#include - -#include +#include +#include namespace lyx { @@ -45,34 +43,11 @@ inline QString const toqstr(std::string const & str) } -/** - * Convert a QChar into a UCS4 character. - * This is a hack (it does only make sense for the common part of the UCS4 - * and UTF16 encodings) and should not be used. - * This does only exist because of performance reasons (a real conversion - * using iconv is too slow on windows). - */ -inline char_type const qchar_to_ucs4(QChar const & qchar) -{ - return static_cast(qchar.unicode()); -} - - -/** - * Convert a UCS4 character into a QChar. - * This is a hack (it does only make sense for the common part of the UCS4 - * and UTF16 encodings) and should not be used. - * This does only exist because of performance reasons (a real conversion - * using iconv is too slow on windows). - */ -inline QChar const ucs4_to_qchar(char_type const ucs4) +/// Is \p c a valid utf16 char? +inline bool is_utf16(char_type c) { - // FIXME: The following cast is not a real conversion but it work - // for the ucs2 subrange of unicode. Instead of an assertion we should - // return some special characters that indicates that its display is - // not supported. - BOOST_ASSERT(ucs4 < 65536); - return QChar(static_cast(ucs4)); + // 0xd800 ... 0xdfff is the range of surrogate pairs. + return c < 0xd800 || (c > 0xdfff && c < 0x10000); } @@ -82,41 +57,37 @@ inline QChar const ucs4_to_qchar(char_type const ucs4) * This is the preferred method of converting anything that possibly * contains non-ASCII stuff to QString. */ -#if QT_VERSION >= 0x040200 inline QString const toqstr(docstring const & ucs4) { // If possible we let qt do the work, since this version does not // need to be superfast. - return QString::fromUcs4(reinterpret_cast(ucs4.data()), ucs4.length()); + return QString::fromUcs4((uint const *)ucs4.data(), ucs4.length()); } -#else -QString const toqstr(docstring const & ucs4); -#endif - /** - * ucs4_to_qstring - convert a UCS4 encoded char_type * into a QString + * toqstr - convert a UCS4 encoded character into a QString * - * This is a hack for the painter and font metrics and should not be used - * elsewhere. Since it uses ucs4_to_qchar it has the same limitations. + * This is the preferred method of converting anything that possibly + * contains non-ASCII stuff to QString. */ -inline void ucs4_to_qstring(char_type const * str, size_t ls, QString & s) +inline QString const toqstr(char_type ucs4) { - int i = static_cast(ls); - s.resize(i); - for (; --i >= 0;) - s[i] = ucs4_to_qchar(str[i]); + return QString::fromUcs4((uint const *)&ucs4, 1); } - /** * qstring_to_ucs4 - convert a QString into a UCS4 encoded docstring * * This is the preferred method of converting anything that possibly * contains non-ASCII stuff to docstring. */ -docstring const qstring_to_ucs4(QString const & qstr); - +inline docstring const qstring_to_ucs4(QString const & qstr) +{ + if (qstr.isEmpty()) + return docstring(); + QVector const ucs4 = qstr.toUcs4(); + return docstring((char_type const *)(ucs4.constData()), ucs4.size()); +} /** * fromqstr - convert a QString into a UTF8 encoded std::string @@ -124,7 +95,10 @@ docstring const qstring_to_ucs4(QString const & qstr); * This should not be used except for output to lyxerr, since all possibly * non-ASCII stuff should be stored in a docstring. */ -std::string const fromqstr(QString const & str); +inline std::string const fromqstr(QString const & str) +{ + return str.isEmpty() ? std::string() : std::string(str.toUtf8()); +} } // namespace lyx