[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scalaの文字列をバイト列に変換する方法、あるいはバイト列を文字列に変換する方法について解説します。
Scalaには独自のAPIが用意されているわけではないので、JavaのAPIを活用します。
後述しますが、バイト列の側の文字コードには注意しましょう。
getBytes
メソッドを使用して文字列をバイト列に変換する
文字列をバイト列に変換するには、String#getBytes()
メソッドを使用します。
Javapublic byte[] getBytes()
Scala風に読み替えると以下のような感じになります。
Scaladef getBytes: Array[Byte]
サンプルとして以下の文字列を使用します。
val s = s"Scala逆引き解説 scalapedia"
この文字列をバイト列に変換します。
val bytes = s.getBytes() println(bytes.mkString(","))
このコードでは文字列をバイト列に変換し、その中身を出力しています。
出力は以下のようになります。
83,99,97,108,97,-23,-128,-122,-27,-68,-107,-29,-127,-115,-24,-89,-93,-24,-86,-84,32,115,99,97,108,97,112,101,100,105,97
バイト列の中身が出力されました。
java.lang.String#getBytes()
文字コードを指定して文字列をバイト列に変換する
さて、getBytes()
メソッドで出力される文字コードは、実行する環境における標準の文字セットが使用されます。
標準の文字セットはシステムプロパティのfile.encoding
にて指定します。
また、特に指定がなければUTF-8となります。
Scalapediaの環境におけるデフォルトの文字コードはUTF-8なのですが、ここで実際にUTF-8で出力できているのかどうか確認してみましょう。
文字セットを指定して文字列をバイト列に変換するには、getBytes(Charset charset)
メソッドを使用します。
Javapublic byte[] getBytes(Charset charset)
Scala風に読み替えると以下のような感じになります。
Scaladef getBytes(charset: Charset): Array[Byte]
実際にUTF-8を指定して文字列をバイト列に変換してみましょう。
val utf8Bytes = s.getBytes(StandardCharsets.UTF_8) println(utf8Bytes.mkString(",")) println(bytes.sameElements(utf8Bytes))
このコードでは文字列をバイト列に変換し、そのバイト列の中身を標準出力しています。
さらに、UTF-8で出力した文字列の内容が先ほど出力した文字列の内容と一致することを確認しています。
UTF-8はjava.nio.charset.StandardCharsets
に用意されています。
これを使用すれば間違いがありませんのでお勧めです。
出力は以下のようになります。
83,99,97,108,97,-23,-128,-122,-27,-68,-107,-29,-127,-115,-24,-89,-93,-24,-86,-84,32,115,99,97,108,97,112,101,100,105,97 true
先ほど出力した文字列の内容と一致したことを示す"true"が出力されています。
java.lang.String#getBytes(java.nio.charset.Charset)
java.nio.charset.StandardCharsets
String
のコンストラクタでバイト列を文字列に変換する
今度は、逆にバイト列を文字列に変換してみましょう。
バイト列を文字列に変換するにはString
のコンストラクタを使用します。
Javapublic String(byte[] bytes) public String(byte[] bytes, Charset charset)
charset
には使用したい文字セットを指定します。
charset
に何も指定しなければ、その環境における標準の文字セットが使用されます。
サンプルコードはこちらです。
val charset = Charset.defaultCharset() println(new String(bytes, charset))
ここでは、標準の文字セットを明示的に取得して使用しています。
Charset#defaultCharset
メソッドを実行すると標準の文字セットを取得することができます。
結果は以下のようになります。
Scala逆引き解説 scalapedia
元の文が期待通りに復元できていることがわかります。
java.lang.String#init(byte[], java.nio.charset.Charset)
java.nio.charset.Charset#defaultCharset()
Unicode以外の文字セットを使用する場合は注意
バイト列との変換にUnicode(UTF-8、UTF-16など)以外の文字セットを使用していて、かつその文字セットに存在しない文字が含まれている場合、意図しない変換がなされる可能性があります。
変換の際にUnicode以外の他の文字セットを使用したい場合は、こちらの記事を参照してください。
まとめ
文字列をバイト列に変換するには、getBytes
メソッドを使用します。
変換時にUnicode(UTF-8、UTF-16など)以外の文字セットを使用する場合には、文字セットの互換性に注意しましょう。