SKY-20210407USB\Administrator 9 mēneši atpakaļ
revīzija
7c452bef7d
5 mainītis faili ar 981 papildinājumiem un 0 dzēšanām
  1. 8 0
      README.md
  2. BIN
      exe/codeTransmit.exe
  3. 275 0
      src/mainwindow.py
  4. 390 0
      src/mainwindow.ui
  5. 308 0
      src/uiWindow.py

+ 8 - 0
README.md

@@ -0,0 +1,8 @@
+# CodeTransmit
+基于python开发的编码转换工具,图形化界面基于pyside2(也就是qt5)开发。 
+
+    支持批量转换任意格式的文件编码;
+  
+    可将文件编码转为UTF-8 BOM 、UTF-8、GB2312中的任意一种格式;
+  
+  src文件夹下是源码,exe文件夹下是打包好可直接在windows下运行的exe程序。

BIN
exe/codeTransmit.exe


+ 275 - 0
src/mainwindow.py

@@ -0,0 +1,275 @@
+'''
+@Author: your name
+@Date: 2020-03-13 09:44:52
+@LastEditTime: 2020-03-16 15:21:40
+@LastEditors: Please set LastEditors
+@Description: In User Settings Edit
+@FilePath: \codeTransmit\mainwindow.py
+'''
+# This Python file uses the following encoding: utf-8
+import sys, os
+from PySide2.QtWidgets import QApplication, QMainWindow, QFileDialog, QCheckBox, QMessageBox, QTableWidgetItem
+from PySide2.QtCore import Qt
+from PySide2.QtCore import Signal, QObject,Slot #跨线程消息机制
+from uiWindow import Ui_MainWindow
+
+import codecs 
+import chardet 
+import threading
+
+from charamel import Detector
+#转换后的编码类型
+UTF8_BOM = 0
+UTF8 = 1
+GB2312 = 2
+
+FILE = 0
+FOLDER = 1
+
+class Communicate(QObject):
+    speak_word = Signal(str)
+    add_row = Signal(str,str,str,str)
+class MainWindow(QMainWindow):
+
+    @Slot(str)
+    def say_something(self,stuff):
+        # print(stuff)
+        self.ui.textBrowser.append(stuff)
+    @Slot(str,str,str)
+    def slotTableWidgetAddRow(self,filename,source_encoding,decoding,result):
+        # print(stuff)
+        rouCount = self.ui.tableWidget.rowCount()
+        self.ui.tableWidget.insertRow(rouCount)
+        self.ui.tableWidget.setItem(rouCount, 0, QTableWidgetItem(filename))
+        self.ui.tableWidget.setItem(rouCount, 1, QTableWidgetItem(source_encoding))
+        self.ui.tableWidget.setItem(rouCount, 2, QTableWidgetItem(decoding))
+        self.ui.tableWidget.setItem(rouCount, 3, QTableWidgetItem(result))
+        self.ui.tableWidget.item(rouCount, 0).setTextAlignment(Qt.AlignCenter)
+        self.ui.tableWidget.item(rouCount, 1).setTextAlignment(Qt.AlignCenter)
+        self.ui.tableWidget.item(rouCount, 2).setTextAlignment(Qt.AlignCenter)
+        self.ui.tableWidget.item(rouCount, 3).setTextAlignment(Qt.AlignCenter)
+    signal = Communicate()
+    def __init__(self):
+        super(MainWindow, self).__init__()
+        self.ui = Ui_MainWindow()
+        self.ui.setupUi(self)
+        self.initForm()
+        self.signal = Communicate()
+        self.connectSlots()
+
+        self.__path = None                                  #处理的文件/文件夹路径
+        self.__fileSuffix = ['.c', '.h', '.cpp', '.hpp']    #内置可勾选的文件类型
+        self.__customFileSuffix = []                        #自定义的文件类型
+
+        self.usenewmethod = True
+        if self.usenewmethod == False:
+            self.__encodeType = 'UTF-8-SIG'                     #默认的编码类型
+            self.__encodeTypeArr = ['UTF-8-SIG', 'utf-8', 'GB2312']
+        else:
+            self.__encodeType = 'utf_8_sig'                     #默认的编码类型
+            self.__encodeTypeArr = ['utf_8_sig', 'utf_8', 'gb2312']
+        
+        self.__fileOrFolder = FOLDER                        #默认处理文件夹
+        self.__mWorker = None                               #私有线程变量
+        self.detector = Detector()
+
+
+    def initForm(self):
+        self.ui.tableWidget.setColumnCount(4)
+        self.ui.tableWidget.setHorizontalHeaderLabels(["文件名","识别类型","解码方法","结果"])
+        # self.ui.tableWidget.horizontalHeader().setStretchLastSection(True)
+        self.ui.tableWidget.setColumnWidth(0, 165)
+        self.ui.tableWidget.setColumnWidth(1, 70)
+        self.ui.tableWidget.setColumnWidth(2, 70)
+        self.ui.tableWidget.setColumnWidth(3, 70)
+
+    def setFilePath(self, path):
+        self.__path = path
+
+    def getFileSuffix(self):
+        return self.__fileSuffix
+
+    def addFileSuffix(self, item):
+        self.__fileSuffix.append(item)
+
+    def removeFileSuffix(self, item):
+        self.__fileSuffix.remove(item)
+    
+    def clearFileSuffix(self):
+        self.__fileSuffix.clear()
+
+    def setEncodeType(self, type):
+        self.__encodeType = type
+
+    def connectSlots(self):
+        self.ui.btnChooseFolder.clicked.connect(self.onOpenFolderClicked)
+        self.ui.btnChooseFile.clicked.connect(self.onOpenFileClicked)
+        self.ui.btnClear.clicked.connect(self.onBtnClearClicked)
+        self.ui.comboBox.currentIndexChanged.connect(self.onCbEncodeIndexChanged)
+        self.ui.btnCustomCheck.clicked.connect(self.onCustomEncodeCheck)
+        fileTypeArr = self.ui.groupBox.findChildren(QCheckBox)
+        for index, item in enumerate(fileTypeArr):
+            item.stateChanged.connect(self.onFileTypeChanged)
+        self.ui.btnTransmit.clicked.connect(self.onTransmitClicked)
+        self.signal.speak_word.connect(self.say_something)
+        self.signal.add_row.connect(self.slotTableWidgetAddRow)
+        self.signal.speak_word.emit("started!")
+
+    def onOpenFileClicked(self):
+        fileName = QFileDialog.getOpenFileName(self, "", ".")
+        if (fileName is None):
+            self.signal.speak_word.emit("open file failed: fileName is None!")
+            return
+
+        self.setFilePath(fileName[0])
+        self.__fileOrFolder = FILE
+        self.ui.labelPath.setText(fileName[0])
+
+    def onOpenFolderClicked(self):
+        folderName = QFileDialog.getExistingDirectory(self, "", ".")
+        if (folderName is None):
+            self.signal.speak_word.emit("open folder failed:folderName is None!")
+            return
+        
+        self.setFilePath(folderName)
+        self.__fileOrFolder = FOLDER
+        self.ui.labelPath.setText(folderName)
+
+    def onBtnClearClicked(self):
+        self.ui.textBrowser.clear()
+        self.ui.tableWidget.clearContents()
+        self.ui.tableWidget.setRowCount(0)
+
+    def onCbEncodeIndexChanged(self, index):
+        self.setEncodeType(self.__encodeTypeArr[index])
+        self.signal.speak_word.emit("Set encodeType: %s" % self.__encodeTypeArr[index])
+    
+    def onCustomEncodeCheck(self):
+        customStr = self.ui.leditCustomEncode.text()
+        customArr = customStr.split(' ')
+
+        for index, item in enumerate(customArr):
+            if(len(item) < 2):
+                QMessageBox.critical(self, "Error!", "自定义后缀无效:长度至少为2!")
+                return
+            if(item[0] != '.'):
+                QMessageBox.critical(self, "Error!", "自定义后缀无效:必须以 '.' 打头!")
+                return
+            if(item.count('.',) > 1):
+                QMessageBox.critical(self, "Error!", "自定义后缀无效:一种格式中不能出现多个 '.'!")
+                return
+            #移除后缀重复的元素
+            if (item not in self.__fileSuffix) and (item not in self.__customFileSuffix):
+                self.__customFileSuffix.append(item)
+    
+    def onFileTypeChanged(self, state):
+        checkBox = QCheckBox.sender(self)
+        itemText = checkBox.text()
+        if(False == state):
+            if itemText in self.__fileSuffix:
+                self.removeFileSuffix(itemText)
+        else:
+            if itemText not in self.__fileSuffix:
+                self.addFileSuffix(itemText)
+            if itemText in self.__customFileSuffix:
+                self.__customFileSuffix.remove(itemText)
+
+    def enableWidgets(self, enabled):
+        self.ui.groupBoxPath.setEnabled(enabled)
+        self.ui.groupBoxEncode.setEnabled(enabled)
+        self.ui.btnTransmit.setEnabled(enabled)
+        self.ui.btnClear.setEnabled(enabled)
+
+    def onTransmitClicked(self):
+        if self.__path is None:
+            QMessageBox.warning(self, "Warning!", "请先选择'文件'或'文件夹'路径!")
+            return
+
+        self.ui.tableWidget.clearContents()
+        self.ui.tableWidget.setRowCount(0)
+
+        if self.__fileOrFolder == FILE:
+            self.convert(self.__path, self.__encodeType)
+        elif self.__fileOrFolder == FOLDER:
+            if 0 == len(self.__fileSuffix) and 0 == len(self.__customFileSuffix):
+                QMessageBox.critical(self, "Error!", "请设置需要处理的文件后缀格式!")
+                return
+            self.enableWidgets(False)
+            # self.explore(self.__path)
+            self.__mWorker = threading.Thread(target=self.explore, args=(self.__path,))
+            self.__mWorker.start()
+        else:
+            QMessageBox.critical(self, "Error!", "文件类型错误,无法转换!")
+        QApplication.processEvents()
+
+    def explore(self, dir):
+        for root, dirs, files in os.walk(dir):
+            for file in files:
+                suffix = os.path.splitext(file)[1]
+                # if suffix == '.h' or suffix == '.c' or suffix == '.cpp' or suffix == '.hpp' or suffix == '.bat': 
+                #     path = os.path.join(root,file)
+                #     self.convert(path)
+                if self.__fileSuffix:
+                    for item in self.__fileSuffix:
+                        if(item == suffix):
+                            path = os.path.join(root,file)
+                            # print(path)
+                            self.convert(path, self.__encodeType)
+                if self.__customFileSuffix:
+                    for item in self.__customFileSuffix:
+                        if(item == suffix):
+                            path = os.path.join(root,file)
+                            self.convert(path, self.__encodeType)
+
+        self.signal.speak_word.emit("explore over!")
+        self.enableWidgets(True)
+
+    def convert_true(self, content,filePath, source_encoding,decoding,out_enc):
+        try:
+            self.signal.speak_word.emit("正在处理: %s" % filePath)
+            content2 = content.decode(decoding).encode(out_enc)
+            codecs.open(filePath,'wb').write(content2)
+            self.signal.add_row.emit(filePath.split('\\')[-1],source_encoding,decoding,"成功")
+            return True
+
+        except Exception as err:
+            self.signal.speak_word.emit("%s:%s"%(filePath, err))
+            self.signal.add_row.emit(filePath.split('\\')[-1],source_encoding,decoding,"转换失败")
+            return False
+
+    def convert(self, filePath, out_enc):
+        try: 
+            content = codecs.open(filePath,'rb').read()
+            self.usenewmethod = True
+            if self.usenewmethod == False:
+                source_encoding = chardet.detect(content)['encoding']
+            else:                                         
+                source_encoding = self.detector.detect(content)
+                
+            if source_encoding == out_enc:
+                self.signal.speak_word.emit("此文件格式无需转换: %s" % filePath)
+                return
+            elif source_encoding == None:
+                self.signal.speak_word.emit("此文件无法识别编码: %s" % filePath)
+                self.signal.add_row.emit(filePath.split('\\')[-1],"无法识别","无法识别")
+
+            if self.usenewmethod ==False:
+                if source_encoding == "utf-8":
+                    self.convert_true(content,filePath,source_encoding,source_encoding,out_enc)
+                else:
+                    if self.convert_true(content,filePath,source_encoding,"GB2312",out_enc)!=True :
+                        self.convert_true(content,filePath,source_encoding,source_encoding,out_enc)
+            else:
+                self.convert_true(content,filePath,source_encoding,source_encoding,out_enc)
+
+        except Exception as err: 
+            self.signal.speak_word.emit("%s:%s"%(filePath, err))
+            self.signal.add_row.emit(filePath.split('\\')[-1],source_encoding,"转换失败")
+    
+
+if __name__ == "__main__":
+    app = QApplication(sys.argv)
+
+    window = MainWindow()
+    window.show()
+    sys.exit(app.exec_())

+ 390 - 0
src/mainwindow.ui

@@ -0,0 +1,390 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>693</width>
+    <height>487</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>编码转换工具V1.0.0(2020.03.16)</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QVBoxLayout" name="verticalLayout" stretch="0,5,0">
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0,1">
+      <item>
+       <widget class="QLabel" name="label_2">
+        <property name="text">
+         <string>当前路径:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="labelPath">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
+      <item>
+       <layout class="QVBoxLayout" name="verticalLayout_9">
+        <item>
+         <widget class="QGroupBox" name="groupBoxPath">
+          <property name="title">
+           <string>路径设置</string>
+          </property>
+          <layout class="QVBoxLayout" name="verticalLayout_5">
+           <property name="spacing">
+            <number>2</number>
+           </property>
+           <property name="topMargin">
+            <number>5</number>
+           </property>
+           <property name="rightMargin">
+            <number>2</number>
+           </property>
+           <item>
+            <widget class="QTabWidget" name="tabWidget">
+             <property name="currentIndex">
+              <number>1</number>
+             </property>
+             <widget class="QWidget" name="tab">
+              <attribute name="title">
+               <string>选择文件</string>
+              </attribute>
+              <layout class="QVBoxLayout" name="verticalLayout_7">
+               <property name="leftMargin">
+                <number>2</number>
+               </property>
+               <property name="topMargin">
+                <number>2</number>
+               </property>
+               <property name="rightMargin">
+                <number>2</number>
+               </property>
+               <property name="bottomMargin">
+                <number>2</number>
+               </property>
+               <item>
+                <widget class="QFrame" name="frame_2">
+                 <property name="frameShape">
+                  <enum>QFrame::NoFrame</enum>
+                 </property>
+                 <property name="frameShadow">
+                  <enum>QFrame::Raised</enum>
+                 </property>
+                 <layout class="QHBoxLayout" name="horizontalLayout_2">
+                  <item>
+                   <widget class="QPushButton" name="btnChooseFile">
+                    <property name="text">
+                     <string>选择文件...</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <spacer name="horizontalSpacer">
+                    <property name="orientation">
+                     <enum>Qt::Horizontal</enum>
+                    </property>
+                    <property name="sizeHint" stdset="0">
+                     <size>
+                      <width>40</width>
+                      <height>20</height>
+                     </size>
+                    </property>
+                   </spacer>
+                  </item>
+                 </layout>
+                </widget>
+               </item>
+               <item>
+                <spacer name="verticalSpacer">
+                 <property name="orientation">
+                  <enum>Qt::Vertical</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>20</width>
+                   <height>40</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+              </layout>
+             </widget>
+             <widget class="QWidget" name="tab_2">
+              <attribute name="title">
+               <string>选择文件夹</string>
+              </attribute>
+              <layout class="QVBoxLayout" name="verticalLayout_8">
+               <property name="leftMargin">
+                <number>2</number>
+               </property>
+               <property name="topMargin">
+                <number>2</number>
+               </property>
+               <property name="rightMargin">
+                <number>2</number>
+               </property>
+               <property name="bottomMargin">
+                <number>2</number>
+               </property>
+               <item>
+                <widget class="QFrame" name="frame_3">
+                 <property name="frameShape">
+                  <enum>QFrame::NoFrame</enum>
+                 </property>
+                 <property name="frameShadow">
+                  <enum>QFrame::Raised</enum>
+                 </property>
+                 <layout class="QVBoxLayout" name="verticalLayout_4">
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_3">
+                    <item>
+                     <widget class="QPushButton" name="btnChooseFolder">
+                      <property name="text">
+                       <string>选择文件夹...</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <spacer name="horizontalSpacer_2">
+                      <property name="orientation">
+                       <enum>Qt::Horizontal</enum>
+                      </property>
+                      <property name="sizeHint" stdset="0">
+                       <size>
+                        <width>40</width>
+                        <height>20</height>
+                       </size>
+                      </property>
+                     </spacer>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <widget class="QGroupBox" name="groupBox">
+                    <property name="title">
+                     <string>递归处理文件夹中以下类型</string>
+                    </property>
+                    <layout class="QGridLayout" name="gridLayout_3">
+                     <item row="1" column="1">
+                      <widget class="QCheckBox" name="cbTxtFile">
+                       <property name="text">
+                        <string>.txt</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="1" column="3">
+                      <widget class="QCheckBox" name="cbJavaFile">
+                       <property name="text">
+                        <string>.java</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="0" column="2">
+                      <widget class="QCheckBox" name="cbCppFile">
+                       <property name="text">
+                        <string>.cpp</string>
+                       </property>
+                       <property name="checked">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="8" column="0" colspan="4">
+                      <widget class="QLabel" name="label_3">
+                       <property name="text">
+                        <string>如果自定义多种文件类型,不同类型之间用空格分开,如:.html .xml</string>
+                       </property>
+                       <property name="wordWrap">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="0" column="0">
+                      <widget class="QCheckBox" name="cbCFile">
+                       <property name="text">
+                        <string>.c</string>
+                       </property>
+                       <property name="checked">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="1" column="0">
+                      <widget class="QCheckBox" name="cbBatFile">
+                       <property name="text">
+                        <string>.bat</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="1" column="2">
+                      <widget class="QCheckBox" name="cbPyFile">
+                       <property name="text">
+                        <string>.py</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="2" column="0">
+                      <widget class="QCheckBox" name="cbMFile">
+                       <property name="text">
+                        <string>.m</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="0" column="1">
+                      <widget class="QCheckBox" name="cbHFile">
+                       <property name="text">
+                        <string>.h</string>
+                       </property>
+                       <property name="checked">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="0" column="3">
+                      <widget class="QCheckBox" name="cbHppFile">
+                       <property name="text">
+                        <string>.hpp</string>
+                       </property>
+                       <property name="checked">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="6" column="0" colspan="2">
+                      <widget class="QLineEdit" name="leditCustomEncode"/>
+                     </item>
+                     <item row="6" column="2" colspan="2">
+                      <widget class="QPushButton" name="btnCustomCheck">
+                       <property name="text">
+                        <string>应用</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item row="5" column="0" colspan="4">
+                      <widget class="QLabel" name="label">
+                       <property name="text">
+                        <string>自定义类型</string>
+                       </property>
+                      </widget>
+                     </item>
+                    </layout>
+                   </widget>
+                  </item>
+                 </layout>
+                </widget>
+               </item>
+              </layout>
+             </widget>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+        </item>
+        <item>
+         <widget class="QGroupBox" name="groupBoxEncode">
+          <property name="title">
+           <string>编码设置</string>
+          </property>
+          <layout class="QVBoxLayout" name="verticalLayout_6">
+           <item>
+            <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,1">
+             <item>
+              <widget class="QLabel" name="label_4">
+               <property name="styleSheet">
+                <string notr="true"/>
+               </property>
+               <property name="frameShape">
+                <enum>QFrame::NoFrame</enum>
+               </property>
+               <property name="text">
+                <string>转换后的编码:</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QComboBox" name="comboBox">
+               <item>
+                <property name="text">
+                 <string>UTF-8 BOM</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>UTF-8</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>GB2312</string>
+                </property>
+               </item>
+              </widget>
+             </item>
+            </layout>
+           </item>
+          </layout>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,1">
+        <item>
+         <layout class="QHBoxLayout" name="horizontalLayout_6">
+          <item>
+           <widget class="QPushButton" name="btnTransmit">
+            <property name="text">
+             <string>转换</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QPushButton" name="btnClear">
+            <property name="text">
+             <string>清屏</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <spacer name="horizontalSpacer_3">
+            <property name="orientation">
+             <enum>Qt::Horizontal</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>40</width>
+              <height>20</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+         </layout>
+        </item>
+        <item>
+         <widget class="QTableWidget" name="tableWidget"/>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <widget class="QTextBrowser" name="textBrowser"/>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 308 - 0
src/uiWindow.py

@@ -0,0 +1,308 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'mainwindow.ui'
+##
+## Created by: Qt User Interface Compiler version 5.14.1
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
+    QRect, QSize, QUrl, Qt)
+from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
+    QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap,
+    QRadialGradient)
+from PySide2.QtWidgets import *
+
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        if MainWindow.objectName():
+            MainWindow.setObjectName(u"MainWindow")
+        MainWindow.resize(723, 487)
+        self.centralwidget = QWidget(MainWindow)
+        self.centralwidget.setObjectName(u"centralwidget")
+        self.verticalLayout = QVBoxLayout(self.centralwidget)
+        self.verticalLayout.setObjectName(u"verticalLayout")
+        self.horizontalLayout_4 = QHBoxLayout()
+        self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
+        self.label_2 = QLabel(self.centralwidget)
+        self.label_2.setObjectName(u"label_2")
+
+        self.horizontalLayout_4.addWidget(self.label_2)
+
+        self.labelPath = QLabel(self.centralwidget)
+        self.labelPath.setObjectName(u"labelPath")
+
+        self.horizontalLayout_4.addWidget(self.labelPath)
+
+        self.horizontalLayout_4.setStretch(1, 1)
+
+        self.verticalLayout.addLayout(self.horizontalLayout_4)
+
+        self.horizontalLayout = QHBoxLayout()
+        self.horizontalLayout.setObjectName(u"horizontalLayout")
+        self.verticalLayout_9 = QVBoxLayout()
+        self.verticalLayout_9.setObjectName(u"verticalLayout_9")
+        self.groupBoxPath = QGroupBox(self.centralwidget)
+        self.groupBoxPath.setObjectName(u"groupBoxPath")
+        self.verticalLayout_5 = QVBoxLayout(self.groupBoxPath)
+        self.verticalLayout_5.setSpacing(2)
+        self.verticalLayout_5.setObjectName(u"verticalLayout_5")
+        self.verticalLayout_5.setContentsMargins(-1, 5, 2, -1)
+        self.tabWidget = QTabWidget(self.groupBoxPath)
+        self.tabWidget.setObjectName(u"tabWidget")
+        self.tab = QWidget()
+        self.tab.setObjectName(u"tab")
+        self.verticalLayout_7 = QVBoxLayout(self.tab)
+        self.verticalLayout_7.setObjectName(u"verticalLayout_7")
+        self.verticalLayout_7.setContentsMargins(2, 2, 2, 2)
+        self.frame_2 = QFrame(self.tab)
+        self.frame_2.setObjectName(u"frame_2")
+        self.frame_2.setFrameShape(QFrame.NoFrame)
+        self.frame_2.setFrameShadow(QFrame.Raised)
+        self.horizontalLayout_2 = QHBoxLayout(self.frame_2)
+        self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
+        self.btnChooseFile = QPushButton(self.frame_2)
+        self.btnChooseFile.setObjectName(u"btnChooseFile")
+
+        self.horizontalLayout_2.addWidget(self.btnChooseFile)
+
+        self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_2.addItem(self.horizontalSpacer)
+
+
+        self.verticalLayout_7.addWidget(self.frame_2)
+
+        self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
+
+        self.verticalLayout_7.addItem(self.verticalSpacer)
+
+        self.tabWidget.addTab(self.tab, "")
+        self.tab_2 = QWidget()
+        self.tab_2.setObjectName(u"tab_2")
+        self.verticalLayout_8 = QVBoxLayout(self.tab_2)
+        self.verticalLayout_8.setObjectName(u"verticalLayout_8")
+        self.verticalLayout_8.setContentsMargins(2, 2, 2, 2)
+        self.frame_3 = QFrame(self.tab_2)
+        self.frame_3.setObjectName(u"frame_3")
+        self.frame_3.setFrameShape(QFrame.NoFrame)
+        self.frame_3.setFrameShadow(QFrame.Raised)
+        self.verticalLayout_4 = QVBoxLayout(self.frame_3)
+        self.verticalLayout_4.setObjectName(u"verticalLayout_4")
+        self.horizontalLayout_3 = QHBoxLayout()
+        self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
+        self.btnChooseFolder = QPushButton(self.frame_3)
+        self.btnChooseFolder.setObjectName(u"btnChooseFolder")
+
+        self.horizontalLayout_3.addWidget(self.btnChooseFolder)
+
+        self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_3.addItem(self.horizontalSpacer_2)
+
+
+        self.verticalLayout_4.addLayout(self.horizontalLayout_3)
+
+        self.groupBox = QGroupBox(self.frame_3)
+        self.groupBox.setObjectName(u"groupBox")
+        self.gridLayout_3 = QGridLayout(self.groupBox)
+        self.gridLayout_3.setObjectName(u"gridLayout_3")
+        self.cbTxtFile = QCheckBox(self.groupBox)
+        self.cbTxtFile.setObjectName(u"cbTxtFile")
+
+        self.gridLayout_3.addWidget(self.cbTxtFile, 1, 1, 1, 1)
+
+        self.cbJavaFile = QCheckBox(self.groupBox)
+        self.cbJavaFile.setObjectName(u"cbJavaFile")
+
+        self.gridLayout_3.addWidget(self.cbJavaFile, 1, 3, 1, 1)
+
+        self.cbCppFile = QCheckBox(self.groupBox)
+        self.cbCppFile.setObjectName(u"cbCppFile")
+        self.cbCppFile.setChecked(True)
+
+        self.gridLayout_3.addWidget(self.cbCppFile, 0, 2, 1, 1)
+
+        self.label_3 = QLabel(self.groupBox)
+        self.label_3.setObjectName(u"label_3")
+        self.label_3.setWordWrap(True)
+
+        self.gridLayout_3.addWidget(self.label_3, 8, 0, 1, 4)
+
+        self.cbCFile = QCheckBox(self.groupBox)
+        self.cbCFile.setObjectName(u"cbCFile")
+        self.cbCFile.setChecked(True)
+
+        self.gridLayout_3.addWidget(self.cbCFile, 0, 0, 1, 1)
+
+        self.cbBatFile = QCheckBox(self.groupBox)
+        self.cbBatFile.setObjectName(u"cbBatFile")
+
+        self.gridLayout_3.addWidget(self.cbBatFile, 1, 0, 1, 1)
+
+        self.cbPyFile = QCheckBox(self.groupBox)
+        self.cbPyFile.setObjectName(u"cbPyFile")
+
+        self.gridLayout_3.addWidget(self.cbPyFile, 1, 2, 1, 1)
+
+        self.cbMFile = QCheckBox(self.groupBox)
+        self.cbMFile.setObjectName(u"cbMFile")
+
+        self.gridLayout_3.addWidget(self.cbMFile, 2, 0, 1, 1)
+
+        self.cbHFile = QCheckBox(self.groupBox)
+        self.cbHFile.setObjectName(u"cbHFile")
+        self.cbHFile.setChecked(True)
+
+        self.gridLayout_3.addWidget(self.cbHFile, 0, 1, 1, 1)
+
+        self.cbHppFile = QCheckBox(self.groupBox)
+        self.cbHppFile.setObjectName(u"cbHppFile")
+        self.cbHppFile.setChecked(True)
+
+        self.gridLayout_3.addWidget(self.cbHppFile, 0, 3, 1, 1)
+
+        self.leditCustomEncode = QLineEdit(self.groupBox)
+        self.leditCustomEncode.setObjectName(u"leditCustomEncode")
+
+        self.gridLayout_3.addWidget(self.leditCustomEncode, 6, 0, 1, 2)
+
+        self.btnCustomCheck = QPushButton(self.groupBox)
+        self.btnCustomCheck.setObjectName(u"btnCustomCheck")
+
+        self.gridLayout_3.addWidget(self.btnCustomCheck, 6, 2, 1, 2)
+
+        self.label = QLabel(self.groupBox)
+        self.label.setObjectName(u"label")
+
+        self.gridLayout_3.addWidget(self.label, 5, 0, 1, 4)
+
+
+        self.verticalLayout_4.addWidget(self.groupBox)
+
+
+        self.verticalLayout_8.addWidget(self.frame_3)
+
+        self.tabWidget.addTab(self.tab_2, "")
+
+        self.verticalLayout_5.addWidget(self.tabWidget)
+
+
+        self.verticalLayout_9.addWidget(self.groupBoxPath)
+
+        self.groupBoxEncode = QGroupBox(self.centralwidget)
+        self.groupBoxEncode.setObjectName(u"groupBoxEncode")
+        self.verticalLayout_6 = QVBoxLayout(self.groupBoxEncode)
+        self.verticalLayout_6.setObjectName(u"verticalLayout_6")
+        self.horizontalLayout_5 = QHBoxLayout()
+        self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
+        self.label_4 = QLabel(self.groupBoxEncode)
+        self.label_4.setObjectName(u"label_4")
+        self.label_4.setStyleSheet(u"")
+        self.label_4.setFrameShape(QFrame.NoFrame)
+
+        self.horizontalLayout_5.addWidget(self.label_4)
+
+        self.comboBox = QComboBox(self.groupBoxEncode)
+        self.comboBox.addItem("")
+        self.comboBox.addItem("")
+        self.comboBox.addItem("")
+        self.comboBox.setObjectName(u"comboBox")
+
+        self.horizontalLayout_5.addWidget(self.comboBox)
+
+        self.horizontalLayout_5.setStretch(1, 1)
+
+        self.verticalLayout_6.addLayout(self.horizontalLayout_5)
+
+
+        self.verticalLayout_9.addWidget(self.groupBoxEncode)
+
+
+        self.horizontalLayout.addLayout(self.verticalLayout_9)
+
+        self.verticalLayout_2 = QVBoxLayout()
+        self.verticalLayout_2.setObjectName(u"verticalLayout_2")
+        self.horizontalLayout_6 = QHBoxLayout()
+        self.horizontalLayout_6.setObjectName(u"horizontalLayout_6")
+        self.btnTransmit = QPushButton(self.centralwidget)
+        self.btnTransmit.setObjectName(u"btnTransmit")
+
+        self.horizontalLayout_6.addWidget(self.btnTransmit)
+
+        self.btnClear = QPushButton(self.centralwidget)
+        self.btnClear.setObjectName(u"btnClear")
+
+        self.horizontalLayout_6.addWidget(self.btnClear)
+
+        self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_6.addItem(self.horizontalSpacer_3)
+
+
+        self.verticalLayout_2.addLayout(self.horizontalLayout_6)
+
+        self.tableWidget = QTableWidget(self.centralwidget)
+        self.tableWidget.setObjectName(u"tableWidget")
+
+        self.verticalLayout_2.addWidget(self.tableWidget)
+
+        self.verticalLayout_2.setStretch(1, 1)
+
+        self.horizontalLayout.addLayout(self.verticalLayout_2)
+
+        self.horizontalLayout.setStretch(1, 1)
+
+        self.verticalLayout.addLayout(self.horizontalLayout)
+
+        self.textBrowser = QTextBrowser(self.centralwidget)
+        self.textBrowser.setObjectName(u"textBrowser")
+
+        self.verticalLayout.addWidget(self.textBrowser)
+
+        self.verticalLayout.setStretch(1, 5)
+        MainWindow.setCentralWidget(self.centralwidget)
+
+        self.retranslateUi(MainWindow)
+
+        self.tabWidget.setCurrentIndex(1)
+
+
+        QMetaObject.connectSlotsByName(MainWindow)
+    # setupUi
+
+    def retranslateUi(self, MainWindow):
+        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u7f16\u7801\u8f6c\u6362\u5de5\u5177V1.0.0(2020.03.16)", None))
+        self.label_2.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u8def\u5f84:", None))
+        self.labelPath.setText("")
+        self.groupBoxPath.setTitle(QCoreApplication.translate("MainWindow", u"\u8def\u5f84\u8bbe\u7f6e", None))
+        self.btnChooseFile.setText(QCoreApplication.translate("MainWindow", u"\u9009\u62e9\u6587\u4ef6...", None))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u9009\u62e9\u6587\u4ef6", None))
+        self.btnChooseFolder.setText(QCoreApplication.translate("MainWindow", u"\u9009\u62e9\u6587\u4ef6\u5939...", None))
+        self.groupBox.setTitle(QCoreApplication.translate("MainWindow", u"\u9012\u5f52\u5904\u7406\u6587\u4ef6\u5939\u4e2d\u4ee5\u4e0b\u7c7b\u578b", None))
+        self.cbTxtFile.setText(QCoreApplication.translate("MainWindow", u".txt", None))
+        self.cbJavaFile.setText(QCoreApplication.translate("MainWindow", u".java", None))
+        self.cbCppFile.setText(QCoreApplication.translate("MainWindow", u".cpp", None))
+        self.label_3.setText(QCoreApplication.translate("MainWindow", u"\u5982\u679c\u81ea\u5b9a\u4e49\u591a\u79cd\u6587\u4ef6\u7c7b\u578b\uff0c\u4e0d\u540c\u7c7b\u578b\u4e4b\u95f4\u7528\u7a7a\u683c\u5206\u5f00\uff0c\u5982\uff1a.html .xml", None))
+        self.cbCFile.setText(QCoreApplication.translate("MainWindow", u".c", None))
+        self.cbBatFile.setText(QCoreApplication.translate("MainWindow", u".bat", None))
+        self.cbPyFile.setText(QCoreApplication.translate("MainWindow", u".py", None))
+        self.cbMFile.setText(QCoreApplication.translate("MainWindow", u".m", None))
+        self.cbHFile.setText(QCoreApplication.translate("MainWindow", u".h", None))
+        self.cbHppFile.setText(QCoreApplication.translate("MainWindow", u".hpp", None))
+        self.btnCustomCheck.setText(QCoreApplication.translate("MainWindow", u"\u5e94\u7528", None))
+        self.label.setText(QCoreApplication.translate("MainWindow", u"\u81ea\u5b9a\u4e49\u7c7b\u578b", None))
+        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"\u9009\u62e9\u6587\u4ef6\u5939", None))
+        self.groupBoxEncode.setTitle(QCoreApplication.translate("MainWindow", u"\u7f16\u7801\u8bbe\u7f6e", None))
+        self.label_4.setText(QCoreApplication.translate("MainWindow", u"\u8f6c\u6362\u540e\u7684\u7f16\u7801:", None))
+        self.comboBox.setItemText(0, QCoreApplication.translate("MainWindow", u"UTF-8 BOM", None))
+        self.comboBox.setItemText(1, QCoreApplication.translate("MainWindow", u"UTF-8", None))
+        self.comboBox.setItemText(2, QCoreApplication.translate("MainWindow", u"GB2312", None))
+
+        self.btnTransmit.setText(QCoreApplication.translate("MainWindow", u"\u8f6c\u6362", None))
+        self.btnClear.setText(QCoreApplication.translate("MainWindow", u"\u6e05\u5c4f", None))
+    # retranslateUi
+