2016-07-23 2 views
2

나는 다시 QString에 다음 QByteArray에 QString에서 어트 변환에 문제가와 있습니다Qt는 QString QByteArray에 다시

int main() { 

    QString s; 

    for(int i = 0; i < 65536; i++) { 
     s.append(QChar(i)); 
    } 

    QByteArray ba = s.toUtf8(); 

    QString s1 = QString::fromUtf8(ba); 

    if(areSame(s, s1)) { 
     qDebug() << "OK"; 
    } else { 
     qDebug() << "FAIL"; 
     outputErrors(s, s1); 
    } 

    return 0; 
} 

당신은 내가 16 비트 범위 내에있는 모든 문자와 QString 채우기 볼 수 있듯이. QByteArray (Utf8)로 변환 한 다음 QString으로 다시 변환하십시오. 문제는 값이 0 인 문자와 값이 55295보다 큰 문자가 QString으로 다시 변환되지 않는다는 것입니다.

범위 1에서 < 55297 사이에 머문다면이 테스트가 통과합니다.

+0

0으로부터 문자는 문자열을 종료, 그래서 그것이 – user4759923

+0

은 '\ 0'하지만 아직도 내가 다른 값으로 문제를 이해하지 않습니다에 대해 잊어 버렸 작동하지 않습니다 분명하다. – JanSLO

+0

어쩌면이 유니 코드 문자가 구현되지 않았을 수도 있습니다. – user4759923

답변

3

55296 (0xD800)에서 최대 57343 (0xdfff)까지의 문자는 surrogate characters입니다. 그 문자 뒤의 이스케이프 문자로 볼 수 있습니다. 그들은 그 자체로 의미가 없습니다.

// QChar(0) was omitted so s and s1 start with QChar(1) 
for (int i = 1 ; i < 65536 ; i++) 
{ 
    qDebug() << i << QChar(i) << s[i-1] << s1[i-1] << (s[i-1] == s1[i-1]); 
} 
+0

제가 틀렸다면 나에게 맞는 것이 맞지만 문자열은 여전히 ​​동일하지 않습니까? – tofiffe

+1

QString :: toUtf8() 코드 포인트를 호출 할 때 U + D800에서 U + DFFF로 바뀌는 0x3F는 '?'입니다. 그것이 정보가 손실되는 곳입니다. –

+0

그들은 "이스케이프 문자"가 아닙니다. 대리 코드와 결합 된 값은 코드 포인트를 인코딩합니다. 분리 된 surrogate 시퀀스를 가지고 있다면 인코딩이 깨지고 Qt는 그것으로 무엇이든 할 수 있습니다. 길잃은 surrogates를''? ''로 대체하는 것을 포함합니다. – peppe

0

내가 QStringstd::string을 변환하는 작업을했고, QByteArrayQString :

당신은 실행하여 확인할 수 있습니다. 다음은이 작업을 완료하기 위해 내가 한 일입니다. 당신이 "QByteArray::append"에 대한 설명서를 보면

std::string str = "hello world"; 

QString qstring = QString::fromStdString(str); 

QByteArray buffer; 

, 그것은 QString 소요 QByteArray를 반환합니다.

buffer = buffer.append(str);