JavaScriptで日本語テキスト処理:全角半角・文字種別判定の完全実装ガイド
UnicodeコードポイントからIntl.Segmenterまで。JSで日本語を正しく扱う方法。
JavaScriptで日本語テキスト処理
日本語テキストをJSで扱う際のポイントをまとめました。
文字種別の判定
Unicodeのコードポイント範囲を使って文字種を判定します。
function getCharType(ch) {
const cp = ch.codePointAt(0);
if (!cp) return 'other';
if (cp >= 0x3040 && cp <= 0x309F) return 'hiragana';
if (cp >= 0x30A0 && cp <= 0x30FF) return 'katakana';
if ((cp >= 0x4E00 && cp <= 0x9FFF) ||
(cp >= 0x3400 && cp <= 0x4DBF)) return 'kanji';
if ((cp >= 0x0041 && cp <= 0x005A) ||
(cp >= 0x0061 && cp <= 0x007A)) return 'alpha';
if (cp >= 0x0030 && cp <= 0x0039) return 'digit';
return 'other';
}
全角・半角の判定
function isFullwidth(ch) {
const cp = ch.codePointAt(0) ?? 0;
// 全角範囲の判定
return (
(cp >= 0xFF01 && cp <= 0xFF60) || // 全角英数・記号
(cp >= 0xFFE0 && cp <= 0xFFE6) || // 全角記号
(cp >= 0x3000 && cp <= 0x9FFF) || // CJK統合漢字など
(cp >= 0xF900 && cp <= 0xFAFF) // CJK互換漢字
);
}
文字数の正確なカウント
JSのstring.lengthはUTF-16コードユニット数を返します。サロゲートペア(絵文字など)は2としてカウントされます。
// 正しい文字数(コードポイント数)
const text = '😀hello';
console.log(text.length); // 7 (間違い)
console.log([...text].length); // 6 (正しい)
console.log(text.codePointAt(0)); // 128512 (😀のコードポイント)
Intl.Segmenterによる単語分割
const segmenter = new Intl.Segmenter('ja', { granularity: 'word' });
const text = '東京は日本の首都です。';
const words = [...segmenter.segment(text)]
.filter(s => s.isWordLike)
.map(s => s.segment);
console.log(words);
// ['東京', 'は', '日本', 'の', '首都', 'です']
まとめ
[...str].lengthでコードポイント単位の文字数を取得- Unicode範囲でひらがな・カタカナ・漢字を判定
Intl.Segmenterで形態素解析なしに単語分割が可能