【Kotlin,PHP】文字コードごとに文字列のバイト数を計算する
UTF-8 な文字コードが一般的なこの時台、まだまだ古いシステムと連携していると、マルチバイトは 1 文字 2 バイトで見積もっておくというケースも残っています。
そんな中、外部システムと連携する前に文字列のバイトチェックを挟む必要があり、そこで外部システム側の文字コードに合わせて計算する必要が出てきました。
今回は、Kotlin と PHP で文字コードを指定してバイト数を計算してみます。
UTF-8な環境でのバイト数計算
まずは、自前のアプリケーションのデフォルト文字コードが「UTF-8」な場合をみてみましょう。
UTF-8 の環境では、絵文字まで領域を広げると、取り扱う範囲が最大で 4 バイトとなります。
Kotlin と PHP で挙動を確認してみましょう。
Kotlin
まずは Kotlin で以下の 2 つのパターンでバイト数を算出してみます。
前者は「3バイト」、後者は「9バイト」となりました。
println("abc".toByteArray().size)
println("あいう".toByteArray().size)
PHP
続いて PHP で以下の 2 つのパターンでバイト数を算出してみます。
もちろん結果は Kotlin と同じで、前者は「3バイト」、後者は「9バイト」となりました。
echo strlen('abc');
echo strlen('あいう');
SJIS(Shift_JIS)な環境でのバイト数計算
外部システムが UTF-8 ではなく、SJIS や EUC-JP などの文字コードを想定している場合、上記のように UTF-8 前提でバイト数を計算していると結果が異なってきます。
ここでは文字コードを指定してバイト数を計算させてみましょう。
Kotlin
前者は「3バイト」、後者は「6バイト」となりました。
println("abc".toByteArray(charset("SJIS")).size)
println("あいう".toByteArray(charset("SJIS")).size)
PHP
こちらも、前者は「3バイト」、後者は「6バイト」となりました。
strlen(mb_convert_encoding("abc", "SJIS"));
strlen(mb_convert_encoding("あいう", "SJIS"));
まとめ
Kotlin と PHP で、文字コードごとの文字列のバイト数を計算してみました。
10 年くらい前も、同じように古い外部システムとの文字コードの違いでヤキモキしたことがありますが、いつになってもこの手の問題は残っていきますね。
自前のシステムだけでなく、外部システムの仕様(文字コードなど)をチェックして、直前の疎通テストになって慌てないようにしたいですね。