以下是如何使用 PHP 将罗马音转换为片假名/平假名(音译日语文本)。
函数 Romaji2Kana($s) 将返回带有键 'hira' 和 'kata' 的值,分别包含给定字符串的平假名和片假名版本,以 UTF-8 编码。
<?php
define('HIRATABLE', 'a A i I u U e E o O KAGAKIGIKUGUKEGEKOGOSAZASIZISUZUSEZESOZO'.
'TADATIDItuTUDUTEDETODONANINUNENOHABAPAHIBIPIHUBUPUHEBEPEHOBOPO'.
'MAMIMUMEMOyaYAyuYUyoYORARIRUREROwaWAWIWEWOn ');
define('KATATABLE', 'a A i I u U e E o O KAGAKIGIKUGUKEGEKOGOSAZASIZISUZUSEZESOZO'.
'TADATIDItuTUDUTEDETODONANINUNENOHABAPAHIBIPIHUBUPUHEBEPEHOBOPO'.
'MAMIMUMEMOyaYAyuYUyoYORARIRUREROwaWAWIWEWOn VUkake');
function HiraTrans($s)
{
$pos = strpos(HIRATABLE, $s);
if($pos===false) return 0xA1BC; return 0xA4A1 + $pos/2;
}
function KataTrans($s)
{
$pos = strpos(KATATABLE, $s);
if($pos===false) return 0xA1BC; return 0xA5A1 + $pos/2;
}
function Romaji2Kana($s)
{
$s = strtoupper(str_replace(
Array('shi', 'sh', 'fu', 'chi', 'ch', 'tsu', 'dz', 'l', '-',
'â', 'î', 'û', 'ê', 'ô', 'ā', 'ī', 'ū', 'ē', 'ō'),
Array('si', 'sy', 'hu', 'ti', 'ty', 'tu', 'j', 'r', '^',
'a^', 'i^', 'u^', 'e^', 'o^', 'a^', 'i^', 'u^', 'e^', 'o^'),
$s));
$s = preg_replace('@F([AIOE])@e', '"HU".strtolower("\1")', $s);
$s = preg_replace('@V([AIUEO])@e', '"VU".strtolower("\1")', $s);
$s = preg_replace('@([KSTNHMRGZBPD])Y([AUO])@e', '"\1Iy".strtolower("\2")', $s);
$s = preg_replace('@X(TU|Y[AUO]|[AIUEO]|KA|KE)@e', 'strtolower("\1")', $s);
$s = preg_replace('@([KSTHMRYWGZBPDV]{2,})@e',
'str_pad("",2*strlen("\1")-2,"tu").substr("\1",0,1)', $s);
$s = preg_replace('@N(?![AIUEO])@', 'n', $s);
$s = eregi_replace('[^^VAIUEOKSTNHMYRWGZBPD]', '', $s);
$pat = '@([AIUEOnaiueo^]|..)@e';
$rec = 'EUCJP..UTF8';
return
Array('hira' => recode_string($rec,preg_replace($pat, 'pack("n", HiraTrans("\1"))', $s)),
'kata' => recode_string($rec,preg_replace($pat, 'pack("n", KataTrans("\1"))', $s)));
}
print_r( Romaji2Kana('konnichiha') );
?>
注意:由于手册页面中的技术限制,此代码中存在两个错误
- 第一个 str_replace 中的一些字符在某些 php.net 镜像中可能显示不正确。它应该包含带抑扬音的 aiueo 和带长音符号的 aiueo。
- define 中的字符串应该是常量,而不是追加表达式。(行长限制)
-Joel Yliluoma