Skip to content

Commit 0cf29d1

Browse files
committed
继续修改编码兼容性
1 parent 6d6576d commit 0cf29d1

3 files changed

Lines changed: 10 additions & 6 deletions

File tree

src/QArscString.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#include "QArscString.h"
2-
#include "common/QUtf8.h"
31
#include "common/basicDefine.h"
2+
#include "common/QUtf8.h"
3+
#include "QArscString.h"
44

55
uint32_t writeStringLen_16(char* _pBuff, const QString& _str)
66
{
@@ -73,7 +73,6 @@ QString readString(const char* _pBuff, bool _isUTF8)
7373
{
7474
uint t_len = readStringLen_8(_pBuff);
7575
t_str = utf8_to_QString(_pBuff, t_len);
76-
QByteArray t_arr = t_str.toUtf8();
7776
Q_ASSERT(_pBuff[t_len] == 0);
7877
}
7978
return t_str;

src/QStringPool.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ void QStringPool::readBuff(const char* _buff)
103103
{
104104
m_strings.insert(ArscRichStringMap::value_type(*i, (*i)->guid));
105105
m_guid_to_string.insert((*i)->guid, *i);
106-
//理论上,同样的字符串不应该重复出现。
106+
//理论上,同样的字符串不应该重复出现。但是结果某些工具(比如AntiSplit-M)处理的,可能出现这个问题。
107107
Q_ASSERT(m_string_to_guid.find(*i) == m_string_to_guid.end());
108108
m_string_to_guid.insert(ArscRichStringMap::value_type(*i, (*i)->guid));
109109
}

src/common/QUtf8.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@
44

55
QString 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

Comments
 (0)