1 package edu.jiangxin.apktoolbox.convert.encoding; 2 3 import edu.jiangxin.apktoolbox.swing.extend.EasyPanel; 4 import edu.jiangxin.apktoolbox.utils.Constants; 5 6 import javax.swing.*; 7 import javax.swing.table.DefaultTableModel; 8 import java.awt.*; 9 import java.io.Serial; 10 11 public class GarbledTextRecoveryPanel extends EasyPanel { 12 @Serial 13 private static final long serialVersionUID = 1L; 14 15 private JPanel inputPanel; 16 17 private JTextArea inputArea; 18 19 private JPanel resultPanel; 20 21 private DefaultTableModel tableModel; 22 23 private JPanel operationPanel; 24 25 private static final String[] CHARSETS = { 26 "UTF-8", "GBK", "ISO-8859-1", "Big5", "Shift_JIS", "EUC-KR", "Windows-1252" 27 }; 28 29 public GarbledTextRecoveryPanel() throws HeadlessException { 30 super(); 31 } 32 33 @Override 34 public void initUI() { 35 setPreferredSize(new Dimension(900, 600)); 36 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 37 38 createInputPanel(); 39 add(inputPanel); 40 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 41 42 createResultPanel(); 43 add(resultPanel); 44 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 45 46 createOperationPanel(); 47 add(operationPanel); 48 } 49 50 private void createInputPanel() { 51 inputPanel = new JPanel(); 52 BoxLayout layout = new BoxLayout(inputPanel, BoxLayout.X_AXIS); 53 inputPanel.setLayout(layout); 54 55 inputArea = new JTextArea(4, 60); 56 inputArea.setText("鐢变簬鍦ㄧ被璺\uE21A緞涓\uE15E彂鐜颁簡涓€涓\uE045垨澶氫釜澶勭悊绋嬪簭锛屽洜姝ゅ惎鐢ㄤ簡"); 57 JScrollPane inputScroll = new JScrollPane(inputArea); 58 inputScroll.setBorder(BorderFactory.createTitledBorder("Please enter the garbled text:")); 59 inputScroll.setPreferredSize(new Dimension(700, 200)); 60 61 inputPanel.add(inputScroll); 62 } 63 64 private void createResultPanel() { 65 resultPanel = new JPanel(); 66 BoxLayout layout = new BoxLayout(resultPanel, BoxLayout.Y_AXIS); 67 resultPanel.setLayout(layout); 68 69 70 String[] columns = {"Current Encoding", "Original Encoding", "Recovered Result"}; 71 tableModel = new DefaultTableModel(columns, 0); 72 JTable resultTable = new JTable(tableModel); 73 resultTable.setRowHeight(30); 74 resultTable.getColumnModel().getColumn(2).setPreferredWidth(400); 75 JScrollPane tableScroll = new JScrollPane(resultTable); 76 tableScroll.setPreferredSize(new Dimension(700, 300)); 77 78 resultPanel.add(tableScroll); 79 } 80 81 private void createOperationPanel() { 82 operationPanel = new JPanel(); 83 BoxLayout layout = new BoxLayout(operationPanel, BoxLayout.X_AXIS); 84 operationPanel.setLayout(layout); 85 86 JButton recoverButton = new JButton("Try All Encoding Combinations"); 87 recoverButton.addActionListener(e -> recoverAll()); 88 89 operationPanel.add(recoverButton); 90 } 91 92 private void recoverAll() { 93 tableModel.setRowCount(0); 94 String input = inputArea.getText().trim(); 95 if (input.isEmpty()) return; 96 97 for (String now : CHARSETS) { 98 for (String orig : CHARSETS) { 99 if (!now.equals(orig)) { 100 try { 101 byte[] bytes = input.getBytes(now); 102 String recovered = new String(bytes, orig); 103 104 tableModel.addRow(new Object[]{now, orig, recovered}); 105 } catch (Exception ex) { 106 tableModel.addRow(new Object[]{now, orig, "Conversion Failed"}); 107 } 108 } 109 110 } 111 } 112 } 113 }