文字列をバイト列に、またはバイト列を文字列に変換する方法

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年7月6日

[AD] scalapediaでは記事作成ボランティアを募集しています

この記事では、Scalaの文字列をバイト列に変換する方法、あるいはバイト列を文字列に変換する方法について解説します。

Scalaには独自のAPIが用意されているわけではないので、JavaのAPIを活用します。

後述しますが、バイト列の側の文字コードには注意しましょう。

getBytesメソッドを使用して文字列をバイト列に変換する

文字列をバイト列に変換するには、String#getBytes()メソッドを使用します。

Java
public byte[] getBytes()

Scala風に読み替えると以下のような感じになります。

Scala
def 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 11 API Docs:java.lang.String#getBytes()

文字コードを指定して文字列をバイト列に変換する

さて、getBytes()メソッドで出力される文字コードは、実行する環境における標準の文字セットが使用されます。
標準の文字セットはシステムプロパティのfile.encodingにて指定します。
また、特に指定がなければUTF-8となります。

Scalapediaの環境におけるデフォルトの文字コードはUTF-8なのですが、ここで実際にUTF-8で出力できているのかどうか確認してみましょう。

文字セットを指定して文字列をバイト列に変換するには、getBytes​(Charset charset)メソッドを使用します。

Java
public byte[] getBytes​(Charset charset)

Scala風に読み替えると以下のような感じになります。

Scala
def 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"が出力されています。

Stringのコンストラクタでバイト列を文字列に変換する

今度は、逆にバイト列を文字列に変換してみましょう。

バイト列を文字列に変換するにはStringのコンストラクタを使用します。

Java
public String(byte[] bytes) public String(byte[] bytes, Charset charset)

charsetには使用したい文字セットを指定します。
charsetに何も指定しなければ、その環境における標準の文字セットが使用されます。

サンプルコードはこちらです。

val charset = Charset.defaultCharset() println(new String(bytes, charset))

ここでは、標準の文字セットを明示的に取得して使用しています。
Charset#defaultCharsetメソッドを実行すると標準の文字セットを取得することができます。

結果は以下のようになります。

Scala逆引き解説 scalapedia

元の文が期待通りに復元できていることがわかります。

Unicode以外の文字セットを使用する場合は注意

バイト列との変換にUnicode(UTF-8、UTF-16など)以外の文字セットを使用していて、かつその文字セットに存在しない文字が含まれている場合、意図しない変換がなされる可能性があります。

変換の際にUnicode以外の他の文字セットを使用したい場合は、こちらの記事を参照してください。

まとめ

文字列をバイト列に変換するには、getBytesメソッドを使用します。

変換時にUnicode(UTF-8、UTF-16など)以外の文字セットを使用する場合には、文字セットの互換性に注意しましょう。

サイト内検索


カテゴリ「文字列処理」の記事

文字列をエスケープしたり復元したりする方法(Apache Commons Text) JavaとScalaのString/StringBuilder/StringBuffer使い分け事情 文字列を分割する方法(split・splitAt・linesIterator・linesWithSeparatorsメソッド) trimメソッドで文字列の前後の空白を除去する 文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法 特定の文字の文字コード(コード・ポイント)を取得する replaceメソッドなど、文字列を置換する方法を紹介 文字列の先頭や末尾を、取得したり切り落としたりする方法 containsメソッドでStringに特定の文字列が含まれるか調べる方法 数値を文字列に変換する方法 stripメソッドで文字列の前後の全角空白を除去する 文字列を数値に変換するには?to○○メソッドと注意点について 文字列を辞書的に比較する方法/大文字・小文字を区別せずに比較する方法 文字列が特定の文字列で始まるか・終わるかを調べる方法 【getBytes&size】文字列のバイト長を取得する方法 substringでStringを切り取り、部分文字列を抽出する方法 StringOpsとWrappedStringの違いは? 文字列を連結するには?+演算子やString interpolationの使い方 文字列の大文字へ・小文字へ変換する方法 文字列を逆順にする方法 文字列の文字コード(文字セット)を変換する方法 文字列の長さを取得する方法:lengthとcodePointCountの使い分け 文字列をURLエンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法

カテゴリ「文字列処理」の記事

文字列をエスケープしたり復元したりする方法(Apache Commons Text) JavaとScalaのString/StringBuilder/StringBuffer使い分け事情 文字列を分割する方法(split・splitAt・linesIterator・linesWithSeparatorsメソッド) trimメソッドで文字列の前後の空白を除去する 文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法 特定の文字の文字コード(コード・ポイント)を取得する replaceメソッドなど、文字列を置換する方法を紹介 文字列の先頭や末尾を、取得したり切り落としたりする方法 containsメソッドでStringに特定の文字列が含まれるか調べる方法 数値を文字列に変換する方法 stripメソッドで文字列の前後の全角空白を除去する 文字列を数値に変換するには?to○○メソッドと注意点について 文字列を辞書的に比較する方法/大文字・小文字を区別せずに比較する方法 文字列が特定の文字列で始まるか・終わるかを調べる方法 【getBytes&size】文字列のバイト長を取得する方法 substringでStringを切り取り、部分文字列を抽出する方法 StringOpsとWrappedStringの違いは? 文字列を連結するには?+演算子やString interpolationの使い方 文字列の大文字へ・小文字へ変換する方法 文字列を逆順にする方法 文字列の文字コード(文字セット)を変換する方法 文字列の長さを取得する方法:lengthとcodePointCountの使い分け 文字列をURLエンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法