OSDN Git Service

detect only UTF text from QTextCodec::codecForUtfText() for compatibility
authorIvailo Monev <xakepa10@laimg.moc>
Wed, 27 Nov 2019 07:03:25 +0000 (07:03 +0000)
committerIvailo Monev <xakepa10@laimg.moc>
Wed, 27 Nov 2019 07:03:25 +0000 (07:03 +0000)
Signed-off-by: Ivailo Monev <xakepa10@laimg.moc>
src/core/codecs/qicucodec.cpp
src/core/codecs/qicucodec_p.h
src/core/codecs/qtextcodec.cpp

index a1122a6..be3bc33 100644 (file)
@@ -969,41 +969,20 @@ QList<QByteArray> QIcuCodec::availableCodecs()
     return codecs;
 }
 
-QTextCodec *QIcuCodec::codecForText(const QByteArray &text, QTextCodec *defaultCodec)
+QTextCodec *QIcuCodec::codecForUtf(const QByteArray &text, QTextCodec *defaultCodec)
 {
     UErrorCode error = U_ZERO_ERROR;
-    UCharsetDetector *detector = ucsdet_open(&error);
+    const char* name = ucnv_detectUnicodeSignature(text.constData(), text.size(), Q_NULLPTR, &error);
     if (Q_UNLIKELY(U_FAILURE(error))) {
-        qWarning("QIcuCodec::codecForText: ucsdet_open() failed %s", u_errorName(error));
+        qWarning("QIcuCodec::codecForText: ucnv_detectUnicodeSignature() failed %s", u_errorName(error));
         return defaultCodec;
     }
 
-    error = U_ZERO_ERROR;
-    ucsdet_setText(detector, text.constData(), text.size(), &error);
-    if (Q_UNLIKELY(U_FAILURE(error))) {
-        qWarning("QIcuCodec::codecForText: ucsdet_setText() failed %s", u_errorName(error));
-        ucsdet_close(detector);
-        return defaultCodec;
-    }
-
-    error = U_ZERO_ERROR;
-    const UCharsetMatch *match = ucsdet_detect(detector, &error);
-    if (Q_UNLIKELY(U_FAILURE(error))) {
-        qWarning("QIcuCodec::codecForText: ucsdet_detect() failed %s", u_errorName(error));
-        ucsdet_close(detector);
-        return defaultCodec;
-    }
-
-    error = U_ZERO_ERROR;
-    const char *name = ucsdet_getName(match, &error);
-    if (Q_UNLIKELY(U_FAILURE(error))) {
-        qWarning("QIcuCodec::codecForText: ucsdet_getName() failed %s", u_errorName(error));
-        ucsdet_close(detector);
-        return defaultCodec;
+    if (name) {
+        return QTextCodec::codecForName(name);
     }
 
-    ucsdet_close(detector);
-    return QTextCodec::codecForName(name);
+    return defaultCodec;
 }
 
 QIcuCodec::QIcuCodec(const char *name)
index 6e7ee67..e341e69 100644 (file)
@@ -60,7 +60,7 @@ public:
     ~QIcuCodec();
 
     static QList<QByteArray> availableCodecs();
-    static QTextCodec* codecForText(const QByteArray &text, QTextCodec *defaultCodec);
+    static QTextCodec* codecForUtf(const QByteArray &text, QTextCodec *defaultCodec);
 
     QString convertToUnicode(const char *data, int len, ConverterState *state) const final;
     QByteArray convertFromUnicode(const QChar *unicode, int len, ConverterState *state) const final;
index e8426a7..2df8969 100644 (file)
@@ -1206,7 +1206,7 @@ QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba)
 */
 QTextCodec *QTextCodec::codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec)
 {
-    return QIcuCodec::codecForText(ba, defaultCodec);
+    return QIcuCodec::codecForUtf(ba, defaultCodec);
 }
 
 /*!