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;
//Boucle pendant que CoderResult renvoie une erreur
while((result = encoder.encode(inBuf, outBuf, true)).isError()) {
//réinitialiser
encoder.reset();
//Si le mappage n'est pas possible
//Par exemple, TF-8⇒SJIS(Pas MS932)Caractères qui échouent dans ~ ∥- ¢ £ ¬― etc. Entrez ici
if(result.isUnmappable()) {
//Obtenez 1 caractère (caractère dont le mappage a échoué)
char ch = inBuf.get();
byte[] val = null;
//Mettez le traitement de ce qu'il faut faire si le mappage échoue dans cette zone
//Ici, le code octet pour SJIS du caractère dont le mappage a échoué est obtenu à partir de la carte.
val = conversionCharsetMap.get(ch);
//Mettre dans le tampon d'octets pour le résultat d'encodage
outBuf.put(val);
}
//Entrée illégale
if(result.isMalformed()) {
//C'est fondamentalement rare.
}
}
//Flash vers le tampon de résultat d'encodage
encoder.flush(outBuf);
//Retourner le tampon(Inverser)Revenir à la position de départ
outBuf.flip();
return Arrays.copyOf(outBuf.array(), outBuf.limit());
}
Recommended Posts