書けば直接文字リテラルを書いたのと同じことになります。書くのと同じUTF-8の文字エンコーディングUnicode以前の文字コード、SJIS、EUCなどでは文字コードと文字エンコーディング(=バイト列として表現する方法)とが同一でした。書けばSJISで「ソ」と書いたことになります*2。UTF-8では、この文字エンコーディング方法にちょっと面倒な方法を採用しています。コードポイントの範囲によってバイト数が変わるのです。(主にギリシャ文字、アラビア文字など。文字を基本多言語面(BMP)と呼びますが、このBMPに入っていない文字は全てUTF-8で4バイトになります*3。盲点になることもあるのですが、上に示したようにギリシャ文字などは2バイトになります。これを踏まえた上で、さらに2つのUnicodeの仕様を見ていきましょう。異体字セレクタ「ワタナベ」さんの「邊」(U+908A)には細かいバリエーションがあることはご存知でしょう。U+E0106)などです(環境によっては全く同じように表示されるため、手持ちのAndroidで表示したスクリーンショットを貼っておきます)。これら異体字の数は数十種類にもおよび、別々のコードポイントを振ることは現実的ではありません。そこで、まず基底文字(基本となる文字)「邊󠄆」(U+908A)を書き、続けて見えない制御文字をもう1文字書くと字体が変わるという仕組みが作られました。これが異体字セレクタです。U+E0104)は1文字に見えますが実際は2文字分で、しかも2文字目はBMPからはみ出していて4バイトになるので、計7バイトになります。原理的には1文字8バイトまで行きます。結合文字Unicodeには、単独では使われず、他の文字とくっつけるための結合文字があります。U+309A)という見慣れない文字になります。これは1文字ですが、実体としては2文字なので、こちらもやはりUTF-8で6バイトになります。結合文字には「何文字まで」という限度がありません。「か゚」の後ろに結合文字の「○」(U+20DD)を続けて書くと、1文字9バイトのこんな文字になります(今度はWindowsのWordpadで表示した画面キャプチャを示します)。なってくると「1文字は何バイトか」という議論自体がナンセンスになってきますね。泥沼に踏み込むことになるのでここでは触れませんが、絵文字ではこの異体字セレクタと結合文字がふんだんに使われています。絵文字をパーツごとに組み立てていくような仕組みが採られているため、「1文字」で何バイトになるか見当も付きません。この記事が綺麗にまとまっていました。qiita.com結論というわけで、UTF-8ではどのような文字が3バイト以外になるかをまとめます。ASCII文字いわゆる半角英数字と記号は1バイトです。ギリシャ文字、アラビア文字などWikipediaに一覧がありました。間の文字は2バイトになります。0213に含まれる第3・第4水準漢字の大半はBMP外に収録されています。U+E0106)などの異体字です。1文字に見えますが実体は2文字なので最大8バイトになります。結合文字いくらでも文字がくっつくため、1文字何バイトになるか分かりません。「1文字」扱いすべきかどうかは要件によります。まとめこれですっきりしました。「日本語のほとんどはUTF-8で3バイトになる。第3・第4水準漢字の大半は4バイト。記号・結合文字は最低3バイト。あとギリシャ文字とかは2バイトだよ」と言えばいいのですね。分かっているつもりのことでもきちんと調べると気持ちが良いものです。*1:ASCIIコードと同じ*2:この2バイト目は偶然にもSJISの「\」(0x5C)と一致しているため、様々な問題を引き起こしていました。LambdaでWebサイトの死活監視を行ってSlackに結果を流すこんにちは、AWS担当のwakです。Lambdaの話をし...2015-10-28ASP.NETでExcelファイルを作成・ダウンロードさせるこんにちは井上です。使いこなしたい!こんにちは、最近忙しい、和朗です。Authenticatorを用いたニ段階認証を行う(その2)前回はニ段階認証でログインできるとこまで確認しました。(1)はてなブログをはじめよう!jabe20さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。