private static final Map<Character, byte[]> conversionCharsetMap = new LinkedHashMap<Character, byte[]>(){
{
put('~', new byte[]{(byte) 0x81, (byte) 0x60});
put('-', new byte[]{(byte) 0x81, (byte) 0x7C});
put('¢', new byte[]{(byte) 0x81, (byte) 0x91});
put('£', new byte[]{(byte) 0x81, (byte) 0x92});
put('¬', new byte[]{(byte) 0x81, (byte) 0xCA});
put('―', new byte[]{(byte) 0x81, (byte) 0x5C});
put('∥', new byte[]{(byte) 0x81, (byte) 0x61});
}
};
public byte[] encode(String str, String charsetName){
Charset charset = Charset.forName(charsetName);
CharsetEncoder encoder = charset.newEncoder();
CharBuffer inBuf = CharBuffer.wrap(str);
ByteBuffer outBuf = ByteBuffer.allocate(inBuf.length() * (int)encoder.maxBytesPerChar());
CoderResult result;
//Schleife, während CoderResult einen Fehler zurückgibt
while((result = encoder.encode(inBuf, outBuf, true)).isError()) {
//zurücksetzen
encoder.reset();
//Wenn keine Zuordnung möglich ist
//Zum Beispiel TF-8⇒SJIS(Nicht MS932)Zeichen, die in ~ ∥- ¢ £ ¬― usw. fehlschlagen. Geben Sie hier ein
if(result.isUnmappable()) {
//Holen Sie sich 1 Zeichen (Zeichen, dessen Zuordnung fehlgeschlagen ist)
char ch = inBuf.get();
byte[] val = null;
//Legen Sie fest, was zu tun ist, wenn die Zuordnung in diesem Bereich fehlschlägt
//Hier wird der Bytecode für SJIS des Zeichens, das nicht zugeordnet werden konnte, aus der Karte erhalten.
val = conversionCharsetMap.get(ch);
//Zum Codieren des Ergebnisses in den Bytepuffer legen
outBuf.put(val);
}
//Illegale Eingabe
if(result.isMalformed()) {
//Dies ist grundsätzlich selten.
}
}
//Flash zum Codieren des Ergebnispuffers
encoder.flush(outBuf);
//Den Puffer umdrehen(Umkehren)Zurück zur Startposition
outBuf.flip();
return Arrays.copyOf(outBuf.array(), outBuf.limit());
}
Recommended Posts