UTF-8の普及でシフトJISの出番は以前に比べて随分減りました。そえれでもWindows環境では今でも現役ですし、マイコンのようなUnicodeを扱いにくい環境でもよく使います。
今回はそんなシフトJISの第1バイトかどうか、第2バイトかどうかを、それぞれ判定する関数を定義することにします。
第1バイトの判定
定義通りに実装してもいいのですが、元ネタではより効率がよい方法を紹介していますので、それをもとに関数化することにします。
0 1 2 3 4 5 |
constexpr bool is_sjis_lead_byte(int c) { return (((c & 0xffu) ^ 0x20u) - 0xa1) < 94u / 2; } |
今回はconstexprにしてみましたが、C++03までの場合はinlineにすればよいでしょう。C++03でも定数式を得られるメタ関数の定義は割愛します。
引数のcはchar型にしてもよかったのですが、unsigend char型やstd::byte型が渡される可能性も考慮してint型にしました。char型が符号付きの場合はcが負になる可能性が高いので、0xffとANDしています。
第2バイトの判定
0 1 2 3 4 5 6 |
constexpr bool is_sjis_trail_byte(int c) { const auto t = c & 0xffu; return (t - 0x40u) < (94u * 2 + 1) && t != 0x7fu; } |
今回も最初に0xffでANDしておきました。2回登場するのでいったんtに格納しています。あとは元ネタ通りの内容をリライトしただけです。