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 で形態素解析なしに単語分割が可能