文字数 vs バイト数: テキストが思ったより大きい理由
100 文字のような文字列を 100 文字制限のあるフィールドに貼り付けると、長すぎるとして拒否されます。どうやって?答えは、文字とバイトは同じものではなく、噛みつくまで目に見えない文字とバイトの間のギャップが、テキストを扱う際に最もわかりにくい部分の 1 つであるということです。実際に何が起こっているかは次のとおりです。
核となる違い
基本的な英語の文字、数字、一般的な記号である単純な ASCII では、1 文字は正確に 1 バイトであるため、カウントは一致し、誰もそれについて考えません。しかし、Web は UTF-8 で実行されます。UTF-8 は、基本セット以外の文字がそれぞれ 1 バイト以上かかるエンコードです。 é のようなアクセント付き文字は 2 バイトです。多くのアジア文字は 3 バイトです。絵文字は通常 4 バイトです。したがって、テキストが占めるバイト数は、それらの文字が何であるかによって、表示される文字数よりもはるかに大きくなる可能性があります。
バイトサイズが重要な理由
多くの制限は文字ではなくバイトで定義されているため、ギャップは重要です。データベース フィールドのサイズはバイト単位であることが多いため、100 バイトを保持するフィールドは、マルチバイトの場合は 50 文字しか収まらない可能性があります。ネットワーク ペイロード、メッセージ サイズの上限、ストレージ クォータはバイト単位で測定されます。一部の API は、バイト サイズによってリクエスト本文を制限します。文字数制限を十分に下回っているように見えるテキストが長すぎるとして拒否される可能性があるのはまさにこのためです。制限はバイト単位であり、文字数は問題ないように見えても、アクセント付きの文字や絵文字によってバイト数が超過されています。
UTF-8 によるバイトの割り当て方法
UTF-8 は設計により可変幅です。基本的なラテン文字と数字をそれぞれ 1 バイトにエンコードし、平文の英語テキストをコンパクトに保ち、文字ごとにバイト単位の同一性を保ちます。さらに、アクセントのあるラテン文字とギリシャ文字のほとんどに 2 バイト、ほとんどの中国語、日本語、韓国語の文字を含む広範囲の文字に 3 バイト、ほとんどの絵文字といくつかのまれなスクリプトを含む残りの文字に 4 バイトが使用されます。したがって、100 文字の文字列は、その内容に応じて 100 ~ 400 バイトを占める可能性があります。絵文字のツイートは、普通の文字のツイートよりもはるかに重いです。
絵文字サプライズ
絵文字は最も混乱を引き起こすため、特に言及する必要があります。ほとんどの絵文字は UTF-8 で 4 バイトですが、特定のフラグやスキントーンのバリエーションなど、いくつかのコード ポイントを組み合わせて構築されたものはさらに多くなります。したがって、単一の絵文字は 4 つの単純なラテン文字と同じ量のバイト スペースを使用でき、複合絵文字はそれよりも多くのバイト スペースを使用できます。見た目は短いが絵文字が多いメッセージは、予期せずバイト制限を超える可能性があります。絵文字だらけの短いメッセージが拒否されたことがあるなら、これが理由です。
実践的なポイント
制限が文字数で定義されている場合、ほとんどのソーシャル メディアでは制限を投稿して文字数をカウントします。制限がバイト単位で定義されている場合、多くのデータベース フィールド、API、プロトコルはバイト数をカウントしますが、アクセントや絵文字によってバイト数が大きくなることに注意してください。システムがどれを使用しているか不明で、テキストにプレーン ASCII 以外のものが含まれている場合は、安全のためにバイト サイズを確認してください。両方の数字を一度に確認することで、推測の余地がなくなり、「でも十分短そうだった」という拒否反応を防ぐことができます。