16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"ローマ字からカナへ変換"
この発言に対し以下のコメントが寄せられています
#01362 ひの さん RE:ローマ字からカナへ変換
皆さん こんにちは、風の鳩サブレーです。
ローマ字を半角カナに変換する関数です。
どうやって作ってよいか分からなかったので力ずくで書きました(^^;
厳密なチェックをしていないので
正しくないローマ字を入れると適当に解釈して変換します。
エラーは出しません。
もしかしてIMEのAPIでできたりして(^^;
nifty:FDELPHI/MES/15/102 の文字変換ルーチン を使っていますので
HENKANJ.PAS をUSESに追加してください。
// ローマ字→半角カナ 変換
function rome2kana(str : string):string;
var x : string;
i,b,s,l,tt : integer;
h : boolean;
v : array[1..100] of string;
begin
for i := 1 to 100 do
v[i] := '';
// a-o:+0 y:+1 h:+2 s:+3
v[1] := 'あ い う え お '; //aiueo
v[5] := 'か き く け こ '; //k
v[6] := 'キャ キィ キュ キェ キョ '; //ky
v[10] := 'さ し す せ そ '; //s
v[11] := 'シャ シィ シュ シェ ショ '; //sy
v[12] := 'シャ シ シュ シェ ショ '; //sh
v[15] := ' '; //c
v[16] := 'チャ チィ チュ チェ チョ '; //cy
v[17] := 'チャ チ チュ チェ チョ '; //ch
v[20] := 'た ち つ て と '; //t
v[21] := 'チャ チィ チュ チェ チョ '; //ty
v[22] := 'テャ ティ テュ テェ テョ '; //th
v[23] := 'ツァ ツィ ツ ツェ ツォ '; //ts
v[25] := 'な に ぬ ね の '; //n
v[26] := 'ニャ ニィ ニュ ニェ ニョ '; //ny
v[30] := 'は ひ ふ へ ほ '; //h
v[31] := 'ヒャ ヒィ ヒュ ヒェ ヒョ '; //hy
v[35] := 'ま み む め も '; //m
v[36] := 'ミャ ミィ ミュ ミェ ミョ '; //my
v[40] := 'や い ゆ え よ '; //y
v[45] := 'ら り る れ ろ '; //r
v[46] := 'リャ リィ リュ リェ リョ '; //ry
v[50] := 'わ い う え を '; //w
v[55] := 'ファ フィ ふ フェ フォ '; //f
v[56] := 'フャ フィ フュ フェ フョ '; //fy
v[60] := 'ジャじ ジュジェジョ'; //j
v[61] := 'ジャジィジュジュジョ'; //jy
v[65] := 'が ぎ ぐ げ ご '; //g
v[66] := 'ギャギィギュギェギョ'; //gy
v[70] := 'ざ じ ず ぜ ぞ '; //z
v[71] := 'ジャジィジュジュジョ'; //zy
v[75] := 'だ ぢ づ で ど '; //d
v[76] := 'ヂャヂィヂュヂェヂョ'; //dy
v[80] := 'ば び ぶ べ ぼ '; //b
v[81] := 'ビャビィビュビェビョ'; //by
v[85] := 'ぱ ぴ ぷ ぺ ぽ '; //p
v[86] := 'ピャピィピュピェピョ'; //py
v[90] := 'ヴァヴィヴ ヴェヴォ'; //v
result := '';
h := True;
s := 0;
x := ansilowercase(trim(ZenToHank(str)));
l := length(x);
i := 1;
while i <= l do
begin
if IsDBCSLeadByte(ord(x[i])) then
inc(i,2)
else if x[i] = ' ' then
begin
if (not h) and (s = 25) then
result := result + 'ン';
h := True;
inc(i);
result := result + ' ';
end
else if h then
begin
s := 0;
case x[i] of
'a' : s := -1;
'i' : s := -2;
'u' : s := -3;
'e' : s := -4;
'o' : s := -5;
'k' : s := 5;
's' : s := 10;
'c' : s := 15;
't' : s := 20;
'n' : s := 25;
'h' : s := 30;
'm' : s := 35;
'y' : s := 40;
'r' : s := 45;
'w' : s := 50;
'f' : s := 55;
'j' : s := 60;
'g' : s := 65;
'z' : s := 70;
'd' : s := 75;
'b' : s := 80;
'p' : s := 85;
'v' : s := 90;
'-' : s := 999;
'ー' : s := 999;
end;
if s < 0 then
begin
result := result + trim(copy(v[1],s*-3-2,3));
h := true;
s := 0;
end
else if s = 999 then
begin
result := result + 'ー';
h := true;
s := 0;
end
else if s > 1 then
begin
h := False;
end;
inc(i);
end
else
begin
b := 0;
case x[i] of
'a' : b := 1;
'i' : b := 2;
'u' : b := 3;
'e' : b := 4;
'o' : b := 5;
'y' : b := 6;
'h' : b := 7;
's' : b := 8;
'n' : b := 9;
end;
inc(i);
if (b > 0) and (b < 6) then
begin
result := result + trim(copy(v[s],b*3-2,3));
h := true;
end
else if (b < 9) and (b > 0) then
begin
tt := s + b - 5;
if v[tt] <> '' then
s := tt;
end;
// n+子音(yを除く) = ん
if (b in [0,6,7,8,9]) and (s = 25) then
begin
result := result + 'ン';
h := true;
if b < 9 then
dec(i);
end;
if (b in [0,6,7,8]) and (x[i-2] = x[i-1]) then
begin
result := result + 'ッ';
end;
end;
end;
if (not h) and (s = 25) then
begin
result := result + 'ン';
end;
result := zentohank(result);
end;
風の鳩サブレー(JBG03220)
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/07/21 -
Original document by 風の鳩サブレー 氏 ID:(JBG03220)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|