Skip to content
This repository has been archived by the owner on Apr 19, 2022. It is now read-only.

Commit

Permalink
enable text encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
hogelog committed Mar 1, 2013
1 parent 42ca6c1 commit 5eda509
Show file tree
Hide file tree
Showing 4 changed files with 223 additions and 70 deletions.
19 changes: 19 additions & 0 deletions pom.xml
Expand Up @@ -24,11 +24,30 @@
<version>1.0.9</version>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
32 changes: 32 additions & 0 deletions src/main/java/org/hogel/Encoder.java
@@ -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");
}

}
199 changes: 129 additions & 70 deletions src/main/java/org/hogel/MainWindow.java
@@ -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);
}

}
43 changes: 43 additions & 0 deletions src/test/java/org/hogel/EncoderTest.java
@@ -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) {
}
}
}

0 comments on commit 5eda509

Please sign in to comment.