URLスラッグの特殊文字の扱い方:開発者ガイド
ほとんどのスラッグジェネレーターは、素の英語テキストなら問題なく動きます。しかし現実にはアクセント付き文字、非ラテン文字、絵文字、記号があります。本ガイドでは、URLスラッグ生成時にそれらすべてを扱う方法を解説します。
問題: URLが使える文字は限られている
URLが安全に含められるのはASCII文字だけです。英字(a-z)、数字(0-9)、ハイフンやアンダースコアなどわずかな記号に限られます。それ以外は変換するかパーセントエンコード(é なら %C3%A9)する必要があります。パーセントエンコードされたURLは見栄えが悪く、読みにくく、SEOにも不利です。その解決策が音訳です。
音訳: 中心となる手法
音訳は、ある文字体系の文字を最も近いASCII相当に変換します。よくある例:
| 入力 | 音訳後 | 言語 |
|---|---|---|
| é, è, ê, ë | e | フランス語・ポルトガル語 |
| ü, ö, ä | ue, oe, ae | ドイツ語 |
| ñ | n | スペイン語 |
| ß | ss | ドイツ語 |
| ç | c | フランス語・ポルトガル語 |
当サイトのスラッグジェネレーターは、「音訳」オプションを有効にすると自動で音訳を行います。
Unicode正規化
音訳の前に、Unicodeテキストを正規化する必要があります。文字 é はUnicodeで2通りに保存できます。
- 合成済み (NFC): 単一のコードポイント(U+00E9)
- 分解 (NFD): 文字「e」の後に結合用アクセント記号(U+0065 + U+0301)
どちらも画面上は同じに見えますが、バイト列は異なります。NFKD(互換分解)に正規化すると、基本文字とアクセント記号が分離され、アクセントを簡単に除去できます。
// JavaScript
function removeAccents(text) {
return text
.normalize('NFKD')
.replace(/[\u0300-\u036f]/g, '');
}
removeAccents('Café Résumé');
// Output: Cafe Resume
CJK文字(中国語・日本語・韓国語)
CJK文字は、意味のある形でラテン文字に音訳できません。一般的なアプローチは2つあります。
- ローマ字化を使う(中国語はピンイン、日本語はローマ字)。
pinyin(npm)やkuroshiroなどのライブラリで可能ですが、結果がユーザーの期待と合わないことがあります。 - 文字をそのまま残す。現代のブラウザと検索エンジンはUnicode URLを問題なく扱います。GoogleはCJK文字を含むURLをインデックスできます。アドレスバーではパーセントエンコードされますが、検索結果では正しく表示されます。
多くのケースでは選択肢2のほうが安全です—ローマ字化したCJKテキストはネイティブには読みにくいことがあります。
URLの絵文字
技術的には可能(絵文字はパーセントエンコードされる)ですが、スラッグに絵文字を使うのは悪手です。
- 非常に長いパーセントエンコード文字列になる
- 多くのシステムやAPIで壊れる
- 検索エンジンが正しくインデックスできないことがある
- 手で入力できない
スラッグ生成時には常に絵文字を取り除きましょう。簡単な正規表現で除去できます。
text.replace(/[\u{1F600}-\u{1F6FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/gu, '')
よくある特殊文字
良いスラッグジェネレーターがよくある特殊文字をどう扱うかを示します。
| 文字 | 処理 | 理由 |
|---|---|---|
| & | 「and」に置換、または削除 | URLで特別な意味を持つ |
| @, #, ?, = | 削除 | URLの予約文字 |
| “ ” ‘ ’ | 削除 | 句読点、スラッグに意味がない |
| — – | ハイフンに置換 | 用途が近く、区切りに正規化 |
| / \ | ハイフンに置換 | スラッシュはパスのセグメントを作る |
スラッグジェネレーターのテスト
エッジケースを正しく処理できるか、次のような厄介な入力でテストしましょう。
"Café Menu — Special Édition!"→cafe-menu-special-edition"100% Free & Open Source"→100-free-and-open-source" Lots of spaces "→lots-of-spaces"---triple---hyphens---"→triple-hyphens- 空文字列 → 空、またはフォールバックを返すべき
これらの例を当サイトのスラッグ化オンラインツールで直接試して、各ケースの処理を確認してみてください。
ライブラリのサポート
各言語のスラッグライブラリのより詳しい比較は、JavaScript・Python・PHPでのテキストのスラッグ化のガイドをご覧ください。ライブラリごとに特殊文字の扱いは異なるので、用途に合うものを選びましょう。