This repository has been archived by the owner on Apr 19, 2022. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
223 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,37 @@ | ||
package org.hogel; | ||
|
||
import java.nio.ByteBuffer; | ||
import java.nio.CharBuffer; | ||
import java.nio.charset.CharacterCodingException; | ||
import java.nio.charset.Charset; | ||
import java.nio.charset.CharsetDecoder; | ||
|
||
public class Encoder { | ||
public static final Charset SJIS = Charset.forName("SJIS"); | ||
public static final Charset UTF8 = Charset.forName("UTF-8"); | ||
|
||
private static final Charset[] CANDIDATE_ENCODINGS = { | ||
SJIS, UTF8 | ||
}; | ||
|
||
private final Charset target; | ||
|
||
public Encoder(Charset target) { | ||
this.target = target; | ||
} | ||
|
||
public byte[] encode(byte[] data) { | ||
final ByteBuffer dataBuffer = ByteBuffer.wrap(data); | ||
for (final Charset candidate : CANDIDATE_ENCODINGS) { | ||
final CharsetDecoder decoder = candidate.newDecoder(); | ||
try { | ||
dataBuffer.position(0); | ||
final CharBuffer decoded = decoder.decode(dataBuffer); | ||
return decoded.toString().getBytes(target); | ||
} catch (final CharacterCodingException e) { | ||
} | ||
} | ||
throw new IllegalArgumentException("unknown encoding"); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,84 +1,143 @@ | ||
package org.hogel; | ||
|
||
import java.awt.BorderLayout; | ||
import java.awt.EventQueue; | ||
import java.awt.datatransfer.DataFlavor; | ||
import java.awt.datatransfer.Transferable; | ||
import java.awt.datatransfer.UnsupportedFlavorException; | ||
import java.io.File; | ||
import java.io.IOException; | ||
import java.util.Arrays; | ||
import java.util.List; | ||
|
||
import javax.swing.JFrame; | ||
import javax.swing.JTextArea; | ||
import javax.swing.UIManager; | ||
|
||
import java.awt.BorderLayout; | ||
import javax.swing.JPanel; | ||
import javax.swing.JScrollPane; | ||
import javax.swing.JTabbedPane; | ||
import javax.swing.JTable; | ||
import javax.swing.JTextArea; | ||
import javax.swing.TransferHandler; | ||
import javax.swing.UIManager; | ||
|
||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import javax.swing.JScrollPane; | ||
import javax.swing.JTable; | ||
|
||
import com.google.common.io.Files; | ||
|
||
public class MainWindow { | ||
|
||
private static final Logger LOG = LoggerFactory.getLogger(MainWindow.class); | ||
|
||
private JFrame frame; | ||
|
||
private JTextArea logTextArea; | ||
|
||
private JTable replaceTable; | ||
|
||
/** | ||
* Launch the application. | ||
*/ | ||
public static void main(String[] args) { | ||
EventQueue.invokeLater(new Runnable() { | ||
public void run() { | ||
try { | ||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); | ||
MainWindow window = new MainWindow(); | ||
window.frame.setVisible(true); | ||
} catch (Exception e) { | ||
LOG.error(e.getMessage(), e); | ||
} | ||
} | ||
}); | ||
} | ||
|
||
/** | ||
* Create the application. | ||
*/ | ||
public MainWindow() { | ||
initialize(); | ||
} | ||
|
||
/** | ||
* Initialize the contents of the frame. | ||
*/ | ||
private void initialize() { | ||
frame = new JFrame(); | ||
frame.setBounds(100, 100, 450, 300); | ||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
frame.getContentPane().setLayout(new BorderLayout(0, 0)); | ||
|
||
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); | ||
frame.getContentPane().add(tabbedPane, BorderLayout.CENTER); | ||
|
||
JPanel logPanel = new JPanel(); | ||
logPanel.setToolTipText(""); | ||
tabbedPane.addTab("変換ログ", null, logPanel, null); | ||
logPanel.setLayout(new BorderLayout(0, 0)); | ||
|
||
logTextArea = new JTextArea(); | ||
logPanel.add(logTextArea); | ||
logTextArea.setEditable(false); | ||
|
||
JPanel settingPanel = new JPanel(); | ||
tabbedPane.addTab("設定", null, settingPanel, null); | ||
settingPanel.setLayout(new BorderLayout(0, 0)); | ||
|
||
replaceTable = new JTable(); | ||
settingPanel.add(replaceTable, BorderLayout.CENTER); | ||
|
||
JScrollPane scrollPane = new JScrollPane(); | ||
settingPanel.add(scrollPane, BorderLayout.EAST); | ||
} | ||
|
||
private static final Logger LOG = LoggerFactory.getLogger(MainWindow.class); | ||
|
||
private JFrame frame; | ||
|
||
private JTextArea logTextArea; | ||
|
||
private JTable replaceTable; | ||
|
||
/** | ||
* Launch the application. | ||
*/ | ||
public static void main(String[] args) { | ||
EventQueue.invokeLater(new Runnable() { | ||
@Override | ||
public void run() { | ||
try { | ||
UIManager.setLookAndFeel(UIManager | ||
.getSystemLookAndFeelClassName()); | ||
final MainWindow window = new MainWindow(); | ||
window.frame.setVisible(true); | ||
} catch (final Exception e) { | ||
LOG.error(e.getMessage(), e); | ||
} | ||
} | ||
}); | ||
} | ||
|
||
/** | ||
* Create the application. | ||
*/ | ||
public MainWindow() { | ||
initialize(); | ||
} | ||
|
||
/** | ||
* Initialize the contents of the frame. | ||
*/ | ||
private void initialize() { | ||
frame = new JFrame(); | ||
frame.setBounds(100, 100, 450, 300); | ||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
frame.getContentPane().setLayout(new BorderLayout(0, 0)); | ||
|
||
final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); | ||
frame.getContentPane().add(tabbedPane, BorderLayout.CENTER); | ||
|
||
final JPanel logPanel = new JPanel(); | ||
logPanel.setToolTipText(""); | ||
tabbedPane.addTab("変換ログ", null, logPanel, null); | ||
logPanel.setLayout(new BorderLayout(0, 0)); | ||
|
||
logTextArea = new JTextArea(); | ||
logPanel.add(logTextArea); | ||
logTextArea.setEditable(false); | ||
|
||
final JPanel settingPanel = new JPanel(); | ||
tabbedPane.addTab("設定", null, settingPanel, null); | ||
settingPanel.setLayout(new BorderLayout(0, 0)); | ||
|
||
replaceTable = new JTable(); | ||
replaceTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); | ||
settingPanel.add(replaceTable, BorderLayout.CENTER); | ||
|
||
final JScrollPane scrollPane = new JScrollPane(); | ||
settingPanel.add(scrollPane, BorderLayout.EAST); | ||
|
||
final TransferHandler dropHandler = new TransferHandler() { | ||
@Override | ||
public boolean importData(TransferSupport support) { | ||
final Transferable transferable = support.getTransferable(); | ||
try { | ||
@SuppressWarnings("unchecked") | ||
final | ||
List<File> files = (List<File>) transferable | ||
.getTransferData(DataFlavor.javaFileListFlavor); | ||
for (final File file : files) { | ||
encodeFile(file); | ||
} | ||
} catch (UnsupportedFlavorException | IOException e) { | ||
e.printStackTrace(); | ||
return false; | ||
} | ||
return true; | ||
} | ||
|
||
@Override | ||
public boolean canImport(TransferSupport support) { | ||
return true; | ||
} | ||
|
||
private static final long serialVersionUID = 1L; | ||
}; | ||
frame.setTransferHandler(dropHandler); | ||
logTextArea.setTransferHandler(dropHandler); | ||
replaceTable.setTransferHandler(dropHandler); | ||
} | ||
|
||
private final Encoder sjisencoder = new Encoder(Encoder.SJIS); | ||
private void encodeFile(File file) throws IOException { | ||
final byte[] readData = Files.toByteArray(file); | ||
final byte[] writeData = sjisencoder.encode(readData); | ||
if (Arrays.equals(readData, writeData)) { | ||
log(String.format("%s は既にShift-JISです。\n", file.getPath())); | ||
} else { | ||
Files.write(writeData, file); | ||
log(String.format("%s をShift-JISに変換しました。\n", file.getPath())); | ||
} | ||
} | ||
|
||
private void log(String text) { | ||
System.err.print(text); | ||
logTextArea.setText(logTextArea.getText() + text); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package org.hogel; | ||
|
||
import static org.hamcrest.CoreMatchers.is; | ||
import static org.junit.Assert.assertThat; | ||
import static org.junit.Assert.assertTrue; | ||
|
||
import java.nio.charset.Charset; | ||
|
||
import org.junit.Test; | ||
|
||
public class EncoderTest { | ||
Charset UTF8 = Charset.forName("UTF-8"); | ||
Charset SJIS = Charset.forName("SJIS"); | ||
|
||
String text = "日本語日本語"; | ||
|
||
@Test | ||
public void sjis_to_utf8() { | ||
final byte[] sjis = text.getBytes(SJIS); | ||
final byte[] utf8 = text.getBytes(UTF8); | ||
final Encoder encoder = new Encoder(UTF8); | ||
final byte[] encoded = encoder.encode(sjis); | ||
assertThat(encoded, is(utf8)); | ||
} | ||
|
||
@Test | ||
public void utf8_to_utf8() { | ||
final byte[] utf8 = text.getBytes(UTF8); | ||
final Encoder encoder = new Encoder(UTF8); | ||
final byte[] encoded = encoder.encode(utf8); | ||
assertThat(encoded, is(utf8)); | ||
} | ||
@Test | ||
public void error() throws Exception { | ||
final byte[] eucjp = text.getBytes("EUC-JP"); | ||
final Encoder encoder = new Encoder(UTF8); | ||
try { | ||
encoder.encode(eucjp); | ||
assertTrue(false); | ||
} catch (final Exception e) { | ||
} | ||
} | ||
} |