Skip to content

Commit

Permalink
新增字符转换器
Browse files Browse the repository at this point in the history
  • Loading branch information
changfeng1050 committed Jan 9, 2022
1 parent b9cdf30 commit 79061ba
Show file tree
Hide file tree
Showing 11 changed files with 227 additions and 438 deletions.
2 changes: 0 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ set(SOURCE_FILES
CalculateCheckSumDialog.h
ConvertDataDialog.cpp
ConvertDataDialog.h
FrameInfoDialog.cpp
FrameInfoDialog.h
global.cpp
global.h
data/AbstractReadWriter.cpp
Expand Down
9 changes: 3 additions & 6 deletions CalculateCheckSumDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@

#include "CalculateCheckSumDialog.h"


CalculateCheckSumDialog::CalculateCheckSumDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) {
setWindowFlags(
Qt::Dialog | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint);
createUi();
createConnect();
}
Expand All @@ -27,7 +28,6 @@ void CalculateCheckSumDialog::createUi() {

sumResultLabel = new QLabel(this);


auto inputLayout = new QHBoxLayout;
inputLayout->addWidget(inputLineEdit);
inputLayout->addWidget(calculateButton);
Expand All @@ -43,7 +43,6 @@ void CalculateCheckSumDialog::createUi() {
layout->addLayout(inputLayout);
layout->addLayout(resultLayout);

layout->setSizeConstraint(QLayout::SetFixedSize);
setLayout(layout);
setWindowTitle(tr("计算检验"));
}
Expand Down Expand Up @@ -78,14 +77,12 @@ void CalculateCheckSumDialog::createConnect() {

xorResultLabel->show();
sumResultLabel->show();


});
}

QString CalculateCheckSumDialog::getSumResult(const QByteArray &data) {
int sum = 0x00;
for (auto s:data) {
for (auto s: data) {
sum += s;
}
return QString::number(sum & 0x00FFFF, 16).left(4).toUpper();
Expand Down
296 changes: 177 additions & 119 deletions ConvertDataDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,168 +2,226 @@
// Created by chang on 2017-07-31.
//

#include <QtCore/QTextCodec>
#include <QScrollArea>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QtWidgets/QHBoxLayout>
#include <QDebug>
#include <QCheckBox>
#include <QComboBox>
#include <QPushButton>
#include <QTextEdit>

#include "ConvertDataDialog.h"
#include "ConvertDataDialog.h"
#include "global.h"

const QString GBK = "GBK";
const QString UTF8 = "UTF8";
QMap<QString, QTextCodec *> codecMap;
QMap<QString, QTextEdit *> codecTextEditMap;

QStringList otherCodecList;

ConvertDataDialog::ConvertDataDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) {

setWindowFlags(
Qt::Dialog | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint);

codecMap.clear();
codecMap["01-GB18030/GB2312/GBK"] = QTextCodec::codecForName("GB18030");
codecMap["02-UTF-8"] = QTextCodec::codecForName("UTF-8");
codecMap["03-BIG5"] = QTextCodec::codecForName("Big5");
codecMap["04-BIG5-HKSCS"] = QTextCodec::codecForName("Big5-HKSCS");
// codecMap["05-UTF-16"] = QTextCodec::codecForName("UTF-16");
// codecMap["06-UTF-16BE"] = QTextCodec::codecForName("UTF-16BE");
// codecMap["07-UTF-16LE"] = QTextCodec::codecForName("UTF-16LE");
// codecMap["08-UTF-32"] = QTextCodec::codecForName("UTF-32");
// codecMap["09-UTF-32BE"] = QTextCodec::codecForName("UTF-32BE");
// codecMap["10-UTF-32LE"] = QTextCodec::codecForName("UTF-32LE");

otherCodecList.clear();
otherCodecList << "UTF-16"
<< "UTF-16BE"
<< "UTF-16LE"
<< "UTF-32"
<< "UTF-32BE"
<< "UTF-32LE"
<< "CP949"
<< "EUC-KR"
<< "EUC-KR"
<< "HP-ROMAN8"
<< "IBM 850"
<< "IBM 866"
<< "IBM 874"
<< "IOS 2022-JP"
<< "ISO 8859-1"
<< "ISO 8859-2"
<< "ISO 8859-3"
<< "ISO 8859-4"
<< "ISO 8859-5"
<< "ISO 8859-6"
<< "ISO 8859-7"
<< "ISO 8859-8"
<< "ISO 8859-9"
<< "ISO 8859-10"
<< "ISO 8859-13"
<< "ISO 8859-14"
<< "ISO 8859-15"
<< "ISO 8859-16"
<< "Iscii-Bng"
<< "Iscii-Dev"
<< "Iscii-Gjr"
<< "Iscii-Knd"
<< "Iscii-Mlm"
<< "Iscii-Ori"
<< "Iscii-Pnj"
<< "Iscii-Tlg"
<< "Iscii-Tml"
<< "KOI8-R"
<< "KOI8-U"
<< "Macintosh"
<< "Shift-JIS"
<< "TIS-620"
<< "TSCII"
<< "Windows-1250"
<< "Windows-1251"
<< "Windows-1252"
<< "Windows-1253"
<< "Windows-1254"
<< "Windows-1255"
<< "Windows-1256"
<< "Windows-1257"
<< "Windows-1258";

createUi();
createConnect();
}

void ConvertDataDialog::createUi() {

inputTextEdit = new QTextEdit(this);
inputTextEdit->setMinimumSize(600, 200);
inputTextEdit->setMinimumSize(1280, 64);
inputTextEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
inputTextEdit->setFontPointSize(12);
inputTextEdit->setFont(QFont("Microsoft YaHei"));

hexCheckBox = new QCheckBox(tr("HEX"), this);
hexCheckBox->setChecked(true);
hexCheckBox->setChecked(false);

fromCodecComboBox = new QComboBox(this);
fromCodecComboBox->addItems(QStringList() << UTF8 << GBK);
exchangeCodecButton = new QPushButton(tr("<<=>>"), this);
toCodecComboBox = new QComboBox(this);
toCodecComboBox->addItems(QStringList() << GBK << UTF8);
auto separatorLabel = new QLabel(tr("分隔符"), this);
separatorLineEdit = new QLineEdit(" ,", this);
separatorLineEdit->setFixedWidth(50);
separatorLabel->setBuddy(separatorLineEdit);

parseButton = new QPushButton(tr("解析"), this);
convertButton = new QPushButton(tr("转换"), this);
auto prefixLabel = new QLabel(tr("前缀"), this);
prefixLineEdit = new QLineEdit("0x", this);
prefixLineEdit->setFixedWidth(50);
prefixLabel->setBuddy(prefixLineEdit);

auto convertLayout = new QHBoxLayout;
convertLayout->addWidget(hexCheckBox);
convertLayout->addStretch();
convertLayout->addWidget(fromCodecComboBox);
convertLayout->addWidget(exchangeCodecButton);
convertLayout->addWidget(toCodecComboBox);
convertLayout->addStretch();
convertLayout->addWidget(parseButton);
convertLayout->addWidget(convertButton);

resultTextEdit = new QTextEdit(this);
resultTextEdit->setMinimumSize(600, 200);
convertLayout->addWidget(separatorLabel);
convertLayout->addWidget(separatorLineEdit);
convertLayout->addWidget(prefixLabel);
convertLayout->addWidget(prefixLineEdit);

outputLayout = new QVBoxLayout;
auto codecKeys = codecMap.keys();
for (const QString &key: codecKeys) {
auto label = new QLabel(key, this);
label->setStyleSheet("color:blue;");
auto textEdit = new QTextEdit(this);
textEdit->setMinimumHeight(12);
textEdit->setFontPointSize(12);
textEdit->setReadOnly(true);
textEdit->setFont(QFont("Microsoft YaHei"));
textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
label->setBuddy(textEdit);
codecTextEditMap[key] = textEdit;
outputLayout->addWidget(label);
outputLayout->addWidget(textEdit);
}

auto otherLabel = new QLabel(tr("其他编码"), this);
otherCodexComboBox = new QComboBox(this);
otherCodexComboBox->addItems(otherCodecList);
otherLabel->setBuddy(otherCodexComboBox);

auto otherLayout = new QHBoxLayout;
otherLayout->addWidget(otherLabel);
otherLayout->addWidget(otherCodexComboBox);
otherLayout->addStretch();

otherCodecTextEdit = new QTextEdit(this);
otherCodecTextEdit->setMinimumHeight(12);
otherCodecTextEdit->setFontPointSize(12);
otherCodecTextEdit->setReadOnly(true);
otherCodecTextEdit->setFont(QFont("Microsoft YaHei"));
otherCodecTextEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);

outputLayout->addLayout(otherLayout);
outputLayout->addWidget(otherCodecTextEdit);

auto layout = new QVBoxLayout;
layout->addWidget(inputTextEdit);
layout->addLayout(convertLayout);
layout->addWidget(resultTextEdit);
layout->addLayout(outputLayout);

layout->setSizeConstraint(QLayout::SetFixedSize);
setLayout(layout);
setWindowTitle(tr("数据转换"));
setWindowTitle(tr("字符编码"));
}

void ConvertDataDialog::createConnect() {
connect(inputTextEdit, &QTextEdit::textChanged, this, [this] {
processData();
});

connect(exchangeCodecButton, &QPushButton::clicked, [this] {
auto fromCodec = fromCodecComboBox->currentText();
auto toCodec = toCodecComboBox->currentText();
connect(hexCheckBox, &QCheckBox::stateChanged, this, [this] {
processData();
});

fromCodecComboBox->setCurrentText(toCodec);
toCodecComboBox->setCurrentText(fromCodec);
connect(prefixLineEdit, &QLineEdit::textChanged, this, [this] {
processData();
});

connect(parseButton, &QPushButton::clicked, [this] {
auto inputText = inputTextEdit->toPlainText();
auto hex = hexCheckBox->isChecked();
auto fromCodec = fromCodecComboBox->currentText();
auto toCodec = toCodecComboBox->currentText();
if (inputText.isEmpty()) {
showWarning("", QString(tr("请输入内容!")));
return;
}
if (hex) {
auto byteArray = dataFromHex(inputText);

QString resultText;

if (fromCodec == GBK) {
resultText = fromGbk(byteArray);
} else if (fromCodec == UTF8) {
resultText = fromUtf8(byteArray);
}
if (resultText.isEmpty()) {
showWarning("", QString(tr("请检查输入数据是否有误!")));
return;
}
resultTextEdit->setText(resultText);
} else {
const auto &text = inputText;

QString resultText;
if (fromCodec == GBK) {
resultText = toGbkByteArray(text).toHex(' ').toUpper();
} else {
resultText = toUtf8ByteArray(text).toHex(' ').toUpper();
}
if (resultText.isEmpty()) {
showWarning("", QString(tr("请检查输入数据是否有误!")));
return;
}
resultTextEdit->setText(resultText);
}
connect(separatorLineEdit, &QLineEdit::textChanged, this, [this] {
processData();
});

connect(convertButton, &QPushButton::clicked, [this] {
auto inputText = inputTextEdit->toPlainText();
auto hex = hexCheckBox->isChecked();
auto fromCodec = fromCodecComboBox->currentText();
auto toCodec = toCodecComboBox->currentText();

if (hex) {
auto byteArray = dataFromHex(inputText);

QString text;

if (fromCodec == GBK) {
text = fromGbk(byteArray);
} else if (fromCodec == UTF8) {
text = fromUtf8(byteArray);
}

if (text.isEmpty()) {
showWarning("", QString(tr("请检查输入数据是否有误!")));
return;
}

QString convertedText;
if (toCodec == GBK) {
convertedText = toGbkByteArray(text).toHex(' ').toUpper();
} else {
convertedText = toUtf8ByteArray(text).toHex(' ').toUpper();
}

if (convertedText.isEmpty()) {
showWarning("", QString(tr("请检查输入数据是否有误!")));
return;
}

resultTextEdit->setText(convertedText);
} else {
const auto &text = inputText;

QString resultText;
if (toCodec == GBK) {
resultText = toGbkByteArray(text).toHex(' ').toUpper();
} else {
resultText = toUtf8ByteArray(text).toHex(' ').toUpper();
}
if (resultText.isEmpty()) {
showWarning("", QString(tr("请检查输入数据是否有误!")));
return;
}
resultTextEdit->setText(resultText);
}
connect(otherCodexComboBox, &QComboBox::currentTextChanged, this, [this] {
processData();
});

inputTextEdit->setPlainText("123 ABC 中国 中國");
}

void ConvertDataDialog::processData() {
if (inputTextEdit->toPlainText().isEmpty()) {
for (auto &textEdit: codecTextEditMap) {
textEdit->clear();
}
return;
}
auto separator = separatorLineEdit->text();
auto prefix = prefixLineEdit->text();
if (hexCheckBox->isChecked()) {
auto keys = codecTextEditMap.keys();
for (const QString &key: keys) {
auto codec = codecMap[key];
auto byteArray = dataFromHex(inputTextEdit->toPlainText());
codecTextEditMap[key]->setPlainText(fromCodec(byteArray, codec));
}
auto otherCodec = QTextCodec::codecForName(otherCodexComboBox->currentText().toUtf8());
otherCodecTextEdit->setPlainText(fromCodec(dataFromHex(inputTextEdit->toPlainText()), otherCodec));
} else {
auto keys = codecTextEditMap.keys();
for (const QString &key: keys) {
auto codec = codecMap[key];
codecTextEditMap[key]->setPlainText(
dataToHex(toCodecByteArray(inputTextEdit->toPlainText(), codec), separator, prefix));
}
auto otherCodec = QTextCodec::codecForName(otherCodexComboBox->currentText().toUtf8());
otherCodecTextEdit->setPlainText(
dataToHex(toCodecByteArray(inputTextEdit->toPlainText(), otherCodec), separator, prefix));
}
}
Loading

0 comments on commit 79061ba

Please sign in to comment.