Macで入力したときの濁点、半濁点が別の文字となってしまうのを何とかしたい

MacでWordPressサイトを運営している方から相談がありました。

MacでWordPressのサイトを運営しています。記事のタイトルで検索しても検索結果に出てこないんです。どうしてですか?

問題のページを拝見して実際に検索してみるとやはり検索結果にヒットしません。例えば「今日のブログ」というようなタイトルの記事なのに「ブログ」というキーワードでもヒットしないのです。

サイト管理者

なんでだろ?

検索窓に「ブログ」とキーボードで入力してもヒットしませんが、記事のタイトル「今日のブログ」の「ブログ」をコピーして検索窓にペーストして検索するとヒットします。

これは一体どういうことなのでしょうか?

実はこれ、Mac特有の「文字の扱い方の違い」が原因で起こる現象です。
特に問題となるのが、「濁点(゛)」「半濁点(゜)」を含む文字、つまり「が」「ぱ」「ぼ」などです。

Macでは、「が」という文字を「か」+「゛」という2つの文字に分解して扱うことがあります。これはUnicodeという文字コードの仕様で、「分解形(NFD形式)」と呼ばれる形式です。

一方、Windowsや多くのサーバー、そしてGoogleなどの検索エンジンでは、「が」は「が」という1文字(合成形/NFC形式)として扱われます。

つまり、Macで「が」と入力して保存したタイトルは、見た目は普通でも、内部的には「か」+「゛」という別の文字列。これが原因で、検索では「が」と一致するキーワードとして認識されず、検索にヒットしないという事態が起きていたのです。

目次

なぜMacだけがこうなるのか?

この現象は、Macの文字入力システムがUnicodeの「NFD(正規化形式D)」という形式を採用していることに起因します。

Unicodeには「同じ文字」を表す複数の形式がある

たとえば「が」という文字には、以下の2通りの表現方法があります。

表現内容
NFC(合成形式)1文字としてまとめた形U+304C(が)
NFD(分解形式)ベース文字+濁点の2文字U+304B(か)+U+3099(゛)

多くのOSや検索エンジン(Windows・Linux・Googleなど)は、NFC(合成文字)を基本にしています。
ところが、macOSでは入力時や保存時に自動的にNFD(分解形)で処理されることがあります。

見た目は同じでも、内部的には「別の文字列」

この「NFCとNFDの違い」は見た目だけではわかりません。たとえば

  • Macで入力 → + (分解)
  • Windowsで入力 → (1文字)

どちらも画面上は「が」と表示されますが、内部の文字コードが違うため、検索や文字列の一致判定では別物として扱われてしまうのです。

だから「ブログ」と入力してもヒットしない

Macで作成されたタイトルや記事本文に「ブログ(分解形)」が使われていると、検索側が「ブログ(合成形)」を探しても一致せず、結果としてヒットしません。

これは、Googleの検索エンジンやWordPress内検索、あるいは他のプラグイン検索機能でも同様の問題を引き起こすことがあります。このように、Macが採用している「NFD形式」が、検索結果や文字列処理の不一致の原因になっているのです。

WordPress側で入力をNFCに統一する

以下のコードをfunctions.phpに記述します。

function normalize_post_title( $title ) {
    if (class_exists('Normalizer')) {
        return Normalizer::normalize($title, Normalizer::FORM_C);
    }
    return $title;
}
add_filter( 'title_save_pre', 'normalize_post_title' );

normalize_post_title( $title )

  • 投稿タイトル(例:「今日のブログ」)が保存される直前に呼び出される関数です。

if (class_exists('Normalizer'))

  • PHPに「Normalizer」クラスが存在するかをチェックしています。
  • このクラスは intl 拡張モジュールで提供されているもので、文字のUnicode正規化を行うために使います。

Normalizer::normalize($title, Normalizer::FORM_C)

  • 文字列 $title を、正規化形式C(NFC)=合成文字形式 に変換します。
  • たとえば、 + に変換されます。
  • これにより、「見た目は同じでも内部的に違う」文字列を、標準化された形に統一できます。

add_filter( 'title_save_pre', 'normalize_post_title' )

  • WordPressのフィルターフックで、投稿タイトルが保存される前に normalize_post_title() 関数を通すよう指定しています。
  • これにより、タイトルが常にNFC形式で保存されるようになります。

既に投稿済みの記事はどうすればいい?

以下のコードをfunctions.phpに記述します。

//NFD(濁点分離)形式の投稿チェック
add_action('admin_menu', function() {
    add_menu_page(
        'NFDチェック',            // ページタイトル
        'NFDチェック',            // メニュータイトル
        'edit_pages',             // 必要な権限(編集者以上)
        'nfd-check',              // メニューのスラッグ
        function() {              // コールバック関数
            global $wpdb;

            if (!class_exists('Normalizer')) {
                echo 'PHPのintl拡張が有効ではありません。';
                return;
            }

            $posts = $wpdb->get_results("
                SELECT ID, post_title 
                FROM {$wpdb->posts} 
                WHERE post_type = 'post' AND post_status = 'publish'
            ");

            echo '<div class="wrap"><h1>NFD(濁点分離)形式の投稿チェック</h1><ul>';
            foreach ($posts as $post) {
                $title = $post->post_title;
                if ($title !== Normalizer::normalize($title, Normalizer::FORM_C)) {
                    $link = get_edit_post_link($post->ID);
                    echo '<li><a href="' . esc_url($link) . '" target="_blank">' . esc_html($title) . '</a></li>';
                }
            }
            echo '</ul></div>';
        }
    );
});

このコードは、WordPressの管理画面に「NFDチェック」というメニューを追加し、濁点や半濁点が“分離文字(NFD形式)”で保存されている投稿タイトルを検出・一覧表示するためのツールです。

Mac環境で記事タイトルを入力した際に発生しやすい「Unicodeの分解文字問題」に対応するための診断ツールとなっています。

使い方

  • このコードを functions.php またはカスタムプラグインに追加
  • 管理画面メニューに「NFDチェック」が追加される
  • クリックすると、NFD形式のタイトルの投稿が一覧表示される
  • 編集リンクをクリックし、タイトルを修正または再保存する
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

初めてホームページを作成したのは1996年。
2000年よりフリーランスで主に中小企業、学校、各種公的団体、個人事業主のWordPressを活用したホームページ制作を行っています。WordPressテーマはそれぞれのクライアントに合わせて作成しています。
WordPressを活用したサイト運営のための情報発信をしていきます。

目次