全角・半角とは、もともと文字の表示幅に由来する言い方です。ただし、プログラムでは見た目だけでなく、Unicode上の文字範囲として考える必要があります。
一言でいうと
全角・半角は見た目の幅だけで判断せず、どのUnicode範囲の文字を許可するかで定義します。
よくある文字の種類
| 種類 | 例 | Unicode範囲の目安 |
|---|---|---|
| ASCII印字可能文字 | A, 0, ! | U+0020〜U+007E |
| 全角英数字 | A, 1 | U+FF01〜U+FF5E付近 |
| ひらがな | あ | U+3040〜U+309F |
| カタカナ | ア | U+30A0〜U+30FF |
| 半角カタカナ | ア, ン, ゙ | U+FF61〜U+FF9F |
同じように見える文字でも、半角の A と全角の A は別の文字です。
ASCII印字可能文字
半角英数字や基本的な記号は、ASCII印字可能文字として扱うことが多いです。
U+0020 空白
U+0021 !
U+0030 0
U+0041 A
U+007E ~
JavaScriptでは次のように範囲判定できます。
function isPrintableAscii(char) {
const code = char.charCodeAt(0);
return code >= 0x20 && code <= 0x7e;
}
半角カタカナ
半角カタカナは、Unicodeでは U+FF61〜U+FF9F にあります。
function isHalfwidthKatakana(char) {
const code = char.charCodeAt(0);
return code >= 0xff61 && code <= 0xff9f;
}
半角カタカナは \xA1-\xDF ではなく、Unicodeでは \uFF61-\uFF9F の範囲です。
「全角判定」は定義が難しい
「全角」と言っても、何を含めるかは用途によって変わります。
| 判定したいもの | 考える範囲 |
|---|---|
| 日本語を含むか | ひらがな、カタカナ、漢字 |
| ASCII以外を含むか | U+0020〜U+007E以外 |
| 半角カタカナも半角扱いしたい | U+FF61〜U+FF9Fを許可 |
| 表示幅で判定したい | East Asian Widthの考え方が必要 |
フォームの入力制限では、まず「何を許可したいのか」を言語化します。
よくある誤解
| 誤解 | 実際 |
|---|---|
| ASCII以外は全部全角 | 半角カタカナや記号など例外があります |
| 見た目が半角なら同じ文字 | コードポイントが違う場合があります |
| 全角・半角は世界共通の厳密分類 | 用途や仕様によって定義が変わります |
| 正規表現の短い範囲指定で十分 | Unicode範囲を確認する必要があります |
まとめ
全角・半角は、見た目の幅だけでなくUnicode上の範囲として扱います。ASCII印字可能文字は U+0020〜U+007E、半角カタカナは U+FF61〜U+FF9F です。入力チェックでは、まず許可したい文字範囲を明確にします。