2015年10月25日日曜日

文字列とバイト列間のencode, decodeメモ

CharsetEncoderとCharsetDecoderを使った、文字列とバイト列の変換。

・Stringからbyte[]に変換
変換できない文字があった場合、例外通知するようにCodingErrorAction.REPORTを設定した例。
    Stirng src = "aaaa";
    CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder()
            .onMalformedInput(CodingErrorAction.REPORT)
            .onUnmappableCharacter(CodingErrorAction.REPORT);
    CharBuffer cb = CharBuffer.wrap(src);
    buf = encoder.encode(cb);
    byte[] array = buf.array()
または、使い方によっては、こちら。
    Stirng src = "aaaa";
    CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder()
            .onMalformedInput(CodingErrorAction.REPORT)
            .onUnmappableCharacter(CodingErrorAction.REPORT);
    CharBuffer cb = CharBuffer.wrap(src);
    ByteBuffer mbuf = ByteBuffer.allocate(1000);
    encoder.reset().encode(cb, mbuf, true); //戻り値チェックしたほうがいいかも
    byte[] array = buf.array()
・byte[]からString こっちの場合も、変換できない文字があった場合、例外通知するようにCodingErrorAction.REPORTを設定した例。
    byte[] a = {1, ,2, 3}
    CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder()
            .onMalformedInput(CodingErrorAction.REPORT)
     .onUnmappableCharacter(CodingErrorAction.REPORT);
    CharBuffer buf = decoder.decode(ByteBuffer.wrap(a));
    String s = buf.toString();
または、使い方によっては、こちら。
    CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder()
            .onMalformedInput(CodingErrorAction.REPORT)
     .onUnmappableCharacter(CodingErrorAction.REPORT);
    CharBuffer cb = CharBuffer.allocate(1000); 
    decoder.reset().decode(ByteBuffer.wrap(a), cb, true); //戻り値チェックしたほうがいいかも
    String s = cb.flip().toString();

2015年1月10日土曜日

ファイル名の括弧()を削除する

windowsでコピーしたファイル名に括弧(1)とか(2)とか勝手に付けられて
邪魔だから一括でリネームして括弧を削除しようかなと思った。
そこで、cygwinでbash使えば簡単にできるのかなとやってみたら結構ハマった・・

強引かもしれないけど次の方法でできた。
この例では元のファイル名のが次の一覧の場合。
$ ls
a (1).txt  a (100).txt  a (2).txt
これをsedを使って置き換える。
ここでは、括弧)と一緒にスペースも同時にアンダースコアに変更する。
いきなりコマンド実行は怖いから、とりあえず変更後のファイル名をecho。
$ IFS=$'\n'; for f in *\(*\)*; do echo $f|sed -e 's/[ ()]/_/g'; done
a__1_.txt
a__100_.txt
a__2_.txt
まず、forで括弧付きファイルだけを対象にしてる。
それと、IFSを改行にしてるのはファイル名にスペースが入っていて、
forで処理するときにスペースで分割されたものが渡されてきたから・・
sedでは文字を置換してるだけ。

リネーム実行と結果表示。
$ IFS=$'\n'; for f in *\(*\)*; do mv "$f" `echo $f|sed -e 's/[ ()]/_/g'`; done

$ ls
a__1_.txt  a__100_.txt  a__2_.txt
以下を参考にした。
http://unix.stackexchange.com/questions/110213/remove-whitespace-and-parentheses-in-filenames-with-sed