技術系TIPS
PR

【Kotlin,PHP】文字コードごとに文字列のバイト数を計算する

saratogax
記事内に商品プロモーションを含む場合があります

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 年くらい前も、同じように古い外部システムとの文字コードの違いでヤキモキしたことがありますが、いつになってもこの手の問題は残っていきますね。

自前のシステムだけでなく、外部システムの仕様(文字コードなど)をチェックして、直前の疎通テストになって慌てないようにしたいですね。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました