今回やること
この記事では、正規表現を使わずに charCodeAt() と数値比較で文字種を判定します。
数値比較で判定すると、どのUnicode範囲を見ているのかがコード上で明確になります。
前提条件
- Node.jsを実行できる
- JavaScriptの関数とif文が読める
- Unicode範囲は厳密な全文字対応ではなく、学習用に絞る
Step 1: 文字コードを表示する
charcode-check.js を作ります。
const samples = ["A", "0", "!", "あ", "ア", "ア"];
for (const char of samples) {
const code = char.charCodeAt(0);
console.log(char, code, code.toString(16));
}
実行します。
node charcode-check.js
toString(16) で16進数として確認できます。
Step 2: ASCII印字可能文字を判定する
function isPrintableAscii(char) {
const code = char.charCodeAt(0);
return code >= 0x20 && code <= 0x7e;
}
console.log(isPrintableAscii("A")); // true
console.log(isPrintableAscii("あ")); // false
U+0020〜U+007Eを許可します。
Step 3: 半角カタカナを判定する
function isHalfwidthKatakana(char) {
const code = char.charCodeAt(0);
return code >= 0xff61 && code <= 0xff9f;
}
console.log(isHalfwidthKatakana("ア")); // true
console.log(isHalfwidthKatakana("ア")); // false
半角カタカナは U+FF61〜U+FF9F です。
Step 4: 半角扱いの文字を判定する
ASCII印字可能文字と半角カタカナを半角扱いにします。
function isHalfwidthChar(char) {
return isPrintableAscii(char) || isHalfwidthKatakana(char);
}
console.log(isHalfwidthChar("A")); // true
console.log(isHalfwidthChar("ア")); // true
console.log(isHalfwidthChar("あ")); // false
Step 5: 文字列全体を判定する
function isHalfwidthText(text) {
for (const char of text) {
if (!isHalfwidthChar(char)) {
return false;
}
}
return true;
}
console.log(isHalfwidthText("ABC123")); // true
console.log(isHalfwidthText("ABCアイ")); // true
console.log(isHalfwidthText("ABCあ")); // false
for...of を使うと、文字列をコードポイント単位で回せます。ただし、ここで見ている判定範囲はBMP内の文字を対象にしています。
Step 6: ビット演算版と比較する
ASCII判定だけなら、次のようにも書けます。
function isAsciiByBit(char) {
const code = char.charCodeAt(0);
return (code & 0xff80) === 0;
}
ただし、初心者向けやチーム開発では、数値比較の方が意図を読み取りやすいことが多いです。
高速化のためにビット演算を書く前に、まず読みやすい数値比較で正しく動く形を作ります。
よくあるエラー
| エラー | よくある原因 | 確認すること |
|---|---|---|
charCodeAt(0) がNaN | 空文字を渡している | 事前に空文字チェック |
| 絵文字で想定外になる | UTF-16コード単位の問題 | codePointAt() も検討 |
| 全角扱いの定義がぶれる | 許可範囲が曖昧 | 仕様を先に決める |
| 半角カタカナがfalse | 範囲を間違えている | 0xff61〜0xff9f |
まとめ
charCodeAt() を使うと、文字をUTF-16コード単位の数値として見られます。ASCII印字可能文字は 0x20〜0x7e、半角カタカナは 0xff61〜0xff9f で判定できます。実務では、ビット演算より読みやすい数値比較を優先する場面が多いです。
参考リソース
- MDN: String.prototype.charCodeAt()
- MDN: String.prototype.codePointAt()
- Unicode: Halfwidth and Fullwidth Forms