導入
システム開発において、ユーザーが入力した日本語(ひらがな・カタカナ)をシステム内部の識別子やファイル名、あるいはURLスラッグとして活用するためにローマ字へ変換したいというニーズは少なくありません。しかし、単純な置換だけでは「っ(促音)」や「ー(長音)」の処理が複雑になり、実装に苦労することがあります。今回は、日本語をローマ字に変換するロジックを整理し、実務で活用する際の考え方について解説します。
基礎知識
日本語のローマ字変換には、ヘボン式や訓令式など複数の方式が存在します。システム開発においては、国際的に広く利用される「ヘボン式」が好まれる傾向にありますが、要件に応じて柔軟な対応が求められます。
技術的な難所は以下の3点です。
1. 促音(っ): 後続の文字によって子音を重ねる必要がある(例:もっと → motto)。
2. 拗音(ゃ・ゅ・ょ): 2文字を組み合わせて1つの音として扱う必要がある(例:きょ → kyo)。
3. 長音(ー): 前の母音を伸ばす、あるいは無視するなど、文脈による判断が必要です。
実装/解決策
単純な配列置換を繰り返す方法は、ロジックが分かりやすい反面、置換の優先順位を間違えると意図しない変換結果になるリスクがあります。
基本戦略として、「文字数の多い複合音(拗音など)から先に置換する」という順序を守ることが重要です。また、mb_convert_kana関数を使用して、あらかじめ全角ひらがなへ統一してから変換処理を行うと、コードの複雑性を抑えることができます。
サンプルプログラム
以下は、実務レベルでそのまま利用可能なクラス形式のサンプルコードです。必要に応じて置換テーブルを拡張してください。
/
class KanaConverter {
public function convert(string $str): string {
// 全角カタカナを全角ひらがなに変換し、処理を統一する
$str = mb_convert_kana($str, ‘c’, ‘UTF-8’);
// 拗音(きゃ・しゅ・ちょ等)の置換マップ
$mapComplex = [
‘きゃ’ => ‘kya’, ‘きゅ’ => ‘kyu’, ‘きょ’ => ‘kyo’,
‘しゃ’ => ‘sha’, ‘しゅ’ => ‘shu’, ‘しょ’ => ‘sho’,
‘ちゃ’ => ‘cha’, ‘ちゅ’ => ‘chu’, ‘ちょ’ => ‘cho’,
// 他の拗音もここに追加
];
// 拗音を先に置換
$str = str_replace(array_keys($mapComplex), array_values($mapComplex), $str);
// 基本音の置換マップ
$mapBase = [
‘あ’ => ‘a’, ‘い’ => ‘i’, ‘う’ => ‘u’, ‘え’ => ‘e’, ‘お’ => ‘o’,
‘か’ => ‘ka’, ‘き’ => ‘ki’, ‘く’ => ‘ku’, ‘け’ => ‘ke’, ‘こ’ => ‘ko’,
// …省略…
‘ん’ => ‘n’
];
$str = str_replace(array_keys($mapBase), array_values($mapBase), $str);
// 促音(っ)の処理:直後の文字の子音を重複させる簡易ロジック
$str = preg_replace(‘/っ(.)/’, ‘$1$1’, $str);
return $str;
}
}
$converter = new KanaConverter();
echo $converter->convert(‘きょっしょう’); // 実行結果: kyosshou
?>
応用・注意点
実務で導入する際には、以下の点に注意してください。
1. 表記ゆれ: 「じ」を「ji」とするか「zi」とするかなど、プロジェクトの要件定義で変換ルールを明確にしておく必要があります。
2. ライブラリの利用: 複雑な要件や多言語対応が必要な場合は、自作のロジックに固執せず、Composer等で提供されている既存の変換ライブラリ(Intlパッケージや専用の変換ライブラリ)の利用を検討してください。
3. テストの網羅性: ローマ字変換はエッジケース(特殊な読みや外来語)が非常に多いため、ユニットテストを作成し、期待通りの変換が行われるかを確認する環境を整えることを強く推奨します。