UTF-8の普及でシフトJISの出番は以前に比べて随分減りました。そえれでもWindows環境では今でも現役ですし、マイコンのようなUnicodeを扱いにくい環境でもよく使います。

今回はそんなシフトJISの第1バイトかどうか、第2バイトかどうかを、それぞれ判定する関数を定義することにします。

第1バイトの判定

定義通りに実装してもいいのですが、元ネタではより効率がよい方法を紹介していますので、それをもとに関数化することにします。

今回はconstexprにしてみましたが、C++03までの場合はinlineにすればよいでしょう。C++03でも定数式を得られるメタ関数の定義は割愛します。

引数のcはchar型にしてもよかったのですが、unsigend char型やstd::byte型が渡される可能性も考慮してint型にしました。char型が符号付きの場合はcが負になる可能性が高いので、0xffとANDしています。

第2バイトの判定

今回も最初に0xffでANDしておきました。2回登場するのでいったんtに格納しています。あとは元ネタ通りの内容をリライトしただけです。


元ネタ

↑ 7. 文字・文字列・文字コードに関する関数・テンプレート