GarbledTextRecoveryPanel.java

package edu.jiangxin.apktoolbox.convert.encoding;

import edu.jiangxin.apktoolbox.swing.extend.EasyPanel;
import edu.jiangxin.apktoolbox.utils.Constants;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.io.Serial;

public class GarbledTextRecoveryPanel extends EasyPanel {
    @Serial
    private static final long serialVersionUID = 1L;

    private JPanel inputPanel;

    private JTextArea inputArea;

    private JPanel resultPanel;

    private DefaultTableModel tableModel;

    private JPanel operationPanel;

    private static final String[] CHARSETS = {
            "UTF-8", "GBK", "ISO-8859-1", "Big5", "Shift_JIS", "EUC-KR", "Windows-1252"
    };

    public GarbledTextRecoveryPanel() throws HeadlessException {
        super();
    }

    @Override
    public void initUI() {
        setPreferredSize(new Dimension(900, 600));
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        createInputPanel();
        add(inputPanel);
        add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));

        createResultPanel();
        add(resultPanel);
        add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));

        createOperationPanel();
        add(operationPanel);
    }

    private void createInputPanel() {
        inputPanel = new JPanel();
        BoxLayout layout = new BoxLayout(inputPanel, BoxLayout.X_AXIS);
        inputPanel.setLayout(layout);

        inputArea = new JTextArea(4, 60);
        inputArea.setText("鐢变簬鍦ㄧ被璺\uE21A緞涓\uE15E彂鐜颁簡涓€涓\uE045垨澶氫釜澶勭悊绋嬪簭锛屽洜姝ゅ惎鐢ㄤ簡");
        JScrollPane inputScroll = new JScrollPane(inputArea);
        inputScroll.setBorder(BorderFactory.createTitledBorder("Please enter the garbled text:"));
        inputScroll.setPreferredSize(new Dimension(700, 200));

        inputPanel.add(inputScroll);
    }

    private void createResultPanel() {
        resultPanel = new JPanel();
        BoxLayout layout = new BoxLayout(resultPanel, BoxLayout.Y_AXIS);
        resultPanel.setLayout(layout);


        String[] columns = {"Current Encoding", "Original Encoding", "Recovered Result"};
        tableModel = new DefaultTableModel(columns, 0);
        JTable resultTable = new JTable(tableModel);
        resultTable.setRowHeight(30);
        resultTable.getColumnModel().getColumn(2).setPreferredWidth(400);
        JScrollPane tableScroll = new JScrollPane(resultTable);
        tableScroll.setPreferredSize(new Dimension(700, 300));

        resultPanel.add(tableScroll);
    }

    private void createOperationPanel() {
        operationPanel = new JPanel();
        BoxLayout layout = new BoxLayout(operationPanel, BoxLayout.X_AXIS);
        operationPanel.setLayout(layout);

        JButton recoverButton = new JButton("Try All Encoding Combinations");
        recoverButton.addActionListener(e -> recoverAll());

        operationPanel.add(recoverButton);
    }

    private void recoverAll() {
        tableModel.setRowCount(0);
        String input = inputArea.getText().trim();
        if (input.isEmpty()) return;

        for (String now : CHARSETS) {
            for (String orig : CHARSETS) {
                if (!now.equals(orig)) {
                    try {
                        byte[] bytes = input.getBytes(now);
                        String recovered = new String(bytes, orig);

                        tableModel.addRow(new Object[]{now, orig, recovered});
                    } catch (Exception ex) {
                        tableModel.addRow(new Object[]{now, orig, "Conversion Failed"});
                    }
                }

            }
        }
    }
}