QTのあれらの穴の比の日を学ぶことについて--窓の漢化の文字化の問題
まずこのコードについてお話しします.QT 5の開発とインスタンス第2版の書籍のディスクの例です.
実現したのはSocketチャットで、TCPプロトコルですが、Windowsで実行中に中国語の文字化けし問題が発生しました.
コード:
クライアント側
void TcpClient::slotSend()
.toUtf8
().data
();
しかし、この変換に問題があります.したがって、それらを変換してserver側に送信すると、詳細な文字が表示されます.
serverエンド
void TcpClientSocket::dataReceived()
void Server::updateClients(QString msg, int length)
このステップではserverサーバが受信した情報はすべてclient側に送信されますが、その間にQStringタイプに変換されますが、char*タイプが必要です.
元々送ったのはmsg.toLatin1();タイプですが、送信するとクライアントが文字化けしてしまうので、このステップでQStringをchar*タイプに移動する必要があります.
赤い部分が変換の過程です.
最後に、この例には多くの問題があります.例えば、ログイン、終了は変換されていませんが、私たちが送ったのはすべて英語の文字で、これは彼が無視しました.
だから、オンラインとオフラインの文字化けしを修正するときは、変換過程に注意しなければなりません.
QT 5は後でタイプが統一したと言って、しかし実際の問題に出会って、やはり実際に解決して、この問題はとても簡単で、ただあなたが転換する時問題が結局現れることを明らかにするだけです
どこかで、対症的に薬を飲めばいいです.
実現したのはSocketチャットで、TCPプロトコルですが、Windowsで実行中に中国語の文字化けし問題が発生しました.
コード:
クライアント側
void TcpClient::slotSend()
{
if(sendLineEdit->text() == "")
{
return ;
}
QString msg = userName + ":" + sendLineEdit->text();
char *sendBuff=NULL;
QByteArray ba = msg.toUtf8();
sendBuff=ba.data();
qDebug() << "sendBuff = " << sendBuff << endl;
tcpSocket->write(sendBuff,strlen(sendBuff));
sendLineEdit->clear();
}
赤いフォントを見ましたか?これはmsgをchar*に変換することです.以前は一歩前進していました.msg.toUtf8
().data
();
しかし、この変換に問題があります.したがって、それらを変換してserver側に送信すると、詳細な文字が表示されます.
serverエンド
void TcpClientSocket::dataReceived()
{
qDebug() << "connectClient = " << this->socketDescriptor() << endl;
qDebug() << "connectClientPort = " << this->peerPort() << endl;
while(bytesAvailable()>0)
{
int length = bytesAvailable();
char buf[1024];
read(buf,length);
buf[length] = '\0';
qDebug() << buf << endl;
QString msg=QString(buf);
emit updateClients(msg,length);
}
}
このステップは'0'を追加することを覚えています.bufが受信したときは列全体で、終了符がなく、'0'を追加しないと、出力が文字化けしてしまいます.void Server::updateClients(QString msg, int length)
{
emit updateServer(msg,length);
for(int i=0;i<tcpClientSocketList.count();i++)
{
QTcpSocket *item = tcpClientSocketList.at(i);
char *sendBuff=NULL;
QByteArray ba = msg.toUtf8();
sendBuff=ba.data();
if(item->write(sendBuff,length)!=length)
{
continue;
}
}
}
このステップではserverサーバが受信した情報はすべてclient側に送信されますが、その間にQStringタイプに変換されますが、char*タイプが必要です.
元々送ったのはmsg.toLatin1();タイプですが、送信するとクライアントが文字化けしてしまうので、このステップでQStringをchar*タイプに移動する必要があります.
赤い部分が変換の過程です.
最後に、この例には多くの問題があります.例えば、ログイン、終了は変換されていませんが、私たちが送ったのはすべて英語の文字で、これは彼が無視しました.
だから、オンラインとオフラインの文字化けしを修正するときは、変換過程に注意しなければなりません.
QT 5は後でタイプが統一したと言って、しかし実際の問題に出会って、やはり実際に解決して、この問題はとても簡単で、ただあなたが転換する時問題が結局現れることを明らかにするだけです
どこかで、対症的に薬を飲めばいいです.