#navi_header|Java| [[1039]] に続いたメモ4. Javaでバイナリデータを文字列として処理する、つまり、バイナリデータ中のASCII文字だけでindexOf()や正規表現が動けば良い場合、byte配列をどのエンコーディングでStringにするのが適切か? 個人的にはISO-8859-1が、0x00 - 0xFFまでひと通り1バイト=1文字でマッピングがされているため、一番安全な解に思える。 重要なのが制御文字や0x80 - 0xFFまでに1バイト=1文字でマッピングされている点。これが無いと、0x80-0xFFのバイト配列→文字列→バイト配列→文字列、と何回か変形した場合に、元に戻らない。 サンプルコード: - https://github.com/msakamoto-sf/javasnack/blob/master/src/test/java/javasnack/langspecs/TestISO8859.java -- いくつか区分けして試しているが、最終的に 0x00-0xFFのバイト配列をISO-8859-1で文字列にし、それをさらにISO-8859-1でバイト配列に戻して、最初と一致していることをテストしている。 -- ためしに、バイト配列を文字列にする際にUTF-8にして、文字列をバイト配列に戻すのをISO-8859-1にしてみれば、(当然だが)一部の制御文字でマッピングがくずれ、一致しない。 - https://github.com/msakamoto-sf/javasnack/blob/master/src/test/java/javasnack/langspecs/TestISO8859RegEx.java -- 日本語混じりのUTF-8文字列を、一旦ISO-8859-1のバイナリ配列に変換し、それを文字列として正規表現でパターンマッチするサンプル。 参考: - http://ja.wikipedia.org/wiki/ISO/IEC_8859-1 - http://ja.wikipedia.org/wiki/UTF-8 トピックその2:String型とbyte配列の変換って、スレッドセーフか? 基本的に大丈夫だと思うが・・・ なんか、ブロッキングでパフォーマンスが~とかいう話が2006年ごろからまれにあるっぽい。 - Issue 6398 - google-web-toolkit - Avoid Java bottleneck by using explicit Charset for byte[]<->String conversions - GWT - Google Project Hosting -- https://code.google.com/p/google-web-toolkit/issues/detail?id=6398 - The Mysteries of Java Character Set Performance - 1500 Word MTU -- http://blog.inuus.com/vox/2008/05/the-mysteries-of-java-character-set-performance.html - Thread blocking on java.nio.charset.CoderResult | Oracle Community -- https://community.oracle.com/thread/1145918?start=0&tstart=0 - CoderResult (Java Platform SE 7 ) -- http://docs.oracle.com/javase/jp/7/api/java/nio/charset/CoderResult.html #navi_footer|Java|