44
55QString utf8_to_QString (const char * _pBuff, quint32 _len)
66{
7- QByteArray t_byteArr (_pBuff, _len);
87 int t_needlen = (int )u8decodelen (_pBuff) + 1 ;
98 QVector<ucs4_t > t_ucsBuff (t_needlen, 0 );
109 int t_decodelen = (int )u8decode (_pBuff, t_ucsBuff.data (), t_needlen, NULL );
1110 QVector<ushort> t_utf16;
1211 for (int i = 0 , j = 0 ; i < t_decodelen; ++i)
1312 {
1413 uint32_t t_ucs4 = t_ucsBuff[i];
15- if (t_ucs4 > 0x10FFFF || (0xD800 <= t_ucs4 && t_ucs4 <= 0xDFFF ))
14+ if (t_ucs4 > 0x10FFFF ) // || (0xD800 <= t_ucs4 && t_ucs4 <= 0xDFFF))
1615 {
1716 Q_ASSERT (false );
1817 }
@@ -22,6 +21,11 @@ QString utf8_to_QString(const char* _pBuff, quint32 _len)
2221 t_utf16.push_back ((ushort)((t_ucs >> 10 ) + 0xD800 ));
2322 t_utf16.push_back ((ushort)((t_ucs & 0x3FF ) + 0xDC00 ));
2423 }
24+ else if (0xD800 <= t_ucs4 && t_ucs4 <= 0xDFFF )
25+ {
26+ // utf-16的代理项范围,规范情况下是不允许直接使用的,但是某些不规范编码的情况下,也会出现这种情况
27+ t_utf16.push_back ((ushort)t_ucs4);
28+ }
2529 else
2630 t_utf16.push_back ((ushort)t_ucs4);
2731 }
@@ -56,6 +60,7 @@ QByteArray QString_to_utf8(const QString& _str)
5660 }
5761 t_ucsBuff.push_back (t_ucs4);
5862 }
63+ t_ucsBuff.push_back (0 );
5964 int t_needlen2 = (int )u8encodelen (t_ucsBuff.data ()) + 1 ;
6065 QByteArray t_arr (t_needlen2, char (' \0 ' ));
6166 /* int t_encodelen = (int)*/ u8encode (t_ucsBuff.data (), t_arr.data (), t_needlen2, NULL );
0 commit comments