UTF-8编码检测失败特例

本文探讨了GB2312编码中特定汉字被误认为UTF-8字符的问题,列举了易混淆的汉字示例,如“位”、“前”等,并分析其对信息技术应用的影响。
GB2312编码中,下列汉字的GB2312编码会被误认为是UTF-8字符:位、前、支、校、写、元。可能还有!1474112.aspx
void MainWindow::processScanData() { if(scanDataBuffer.isEmpty()){ return; } //查看完整的缓冲区 qDebug() << "Full buffer:" << scanDataBuffer.toHex(); QString scanResult; // 尝试多种编码方式 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); if (codec) { scanResult = codec->toUnicode(scanDataBuffer); qDebug() << "UTF-8 result:" << scanResult; } // 如果UTF-8解码结果不理想,尝试GBK编码(常见于中文环境) if (scanResult.contains(QChar::ReplacementCharacter) || scanResult.isEmpty()) { codec = QTextCodec::codecForName("GBK"); if (codec) { scanResult = codec->toUnicode(scanDataBuffer); qDebug() << "GBK result:" << scanResult; } } // 如果仍然不理想,尝试GB2312 if (scanResult.contains(QChar::ReplacementCharacter) || scanResult.isEmpty()) { codec = QTextCodec::codecForName("GB2312"); if (codec) { scanResult = codec->toUnicode(scanDataBuffer); qDebug() << "GB2312 result:" << scanResult; } } // 如果所有编码失败,使用Latin1作为最后手段 if (scanResult.contains(QChar::ReplacementCharacter) || scanResult.isEmpty()) { scanResult = QString::fromLatin1(scanDataBuffer); qDebug() << "Latin1 result:" << scanResult; } // 查找终止符位置 int endPos = -1; if (scanDataBuffer.contains('\r')) { endPos = scanDataBuffer.indexOf('\r'); } else if (scanDataBuffer.contains('\n')) { endPos = scanDataBuffer.indexOf('\n'); } if (endPos == -1) { // 没有找到终止符,使用全部数据 endPos = scanDataBuffer.length(); } int skipBytes =6; if(scanDataBuffer.size() > skipBytes){ QByteArray textData = scanDataBuffer.mid(skipBytes); QString scanResult = QString::fromUtf8(textData); // 移除可能的前后不可打印符 scanResult.remove(QRegularExpression("^[\\x00-\\x1F]+|[\\x00-\\x1F]+$")); scanResult = scanResult.trimmed(); ui->textEdit_5->setText(scanResult); }else { // 数据长度不足,直接尝试解码 QString scanResult = QString::fromUtf8(scanDataBuffer); scanResult.remove(QRegularExpression("[\\x00-\\x08\\x0B-\\x1F]")); scanResult = scanResult.trimmed(); ui->textEdit_5->setText(scanResult); } // 提取完整二维码数据(不包括终止符) // QByteArray completeData = scanDataBuffer.left(endPos); //scanDataBuffer = scanDataBuffer.mid(endPos + 1); // 移除以处理的数据 // // 移除可能的前后空白符和控制符 // scanResult = QString::fromUtf8(scanDataBuffer); // scanResult = scanResult.trimmed(); // // 移除可能的前后不可打印符 // scanResult.remove(QRegularExpression("^[\\x00-\\x1F]+|[\\x00-\\x1F]+$")); // // 显示扫描结果 // ui->textEdit_5->setText(scanResult); // 清空缓冲区 scanDataBuffer.clear(); } 解析出的数据Full buffer: "55aa3000cb00e8818ce4bd8d09e68a80e69cafe59198090ae5ad98e694bee4bd" UTF-8 result: "U?0\u0000?\u0000职位\t技术员\t\n存放??" GBK result: "U?\u0000?鑱屼綅\t鎶?鏈\uE21A憳\t\n瀛樻斁浣" GB2312 result: "U?\u0000???浣?\t???\uE21A??\t\n瀛??句" Latin1 result: "Ua0\u0000?\u0000è\u0081\u008C??\u008D\t?\u008A\u0080?\u009Cˉ?\u0091\u0098\t\n?\u00AD\u0098?\u0094???"
最新发布
09-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值