スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PL/pgSQLで半角全角変換する

Webとかの入力フォームで、全角を入力しろだの半角を入力しろだの書いてあるのがありますが、あれって何で入力する人がいちいち気にしなくちゃいけないんですかね?
入力された後自分がほしい形式に勝手に変換しやがれ!っていつも思ってます。
ということで、半角カナと全角カナを相互に変換する関数を作ってみます。
まずはベースになる関数から。
■文字列を指定した方法で変換する

CREATE OR REPLACE FUNCTION uv_to_moji_henkan(
p_src text,
p_from_ary text[],
p_to_ary text[],
p_from text,
p_to text
) RETURNS text AS $$
DECLARE
w_result text := p_src;
BEGIN
IF NOT uv_is_set(p_src) THEN
RETURN p_src;
END IF;
IF p_from_ary IS NOT NULL THEN
FOR i in 1..array_length(p_from_ary, 1) LOOP
w_result := replace(w_result, p_from_ary[i], p_to_ary[i]);
END LOOP;
END IF;
IF p_from IS NOT NULL THEN
w_result := translate(w_result, p_from, p_to);
END IF;
RETURN w_result;
END;
$$ LANGUAGE plpgsql

二段階で文字列を変換しています。
最初に文字列から文字列への変換です。変換前文字列と変換後文字列の配列を渡してLOOPで変換しています。
その後、文字ごとに1対1で変換しています。
では、ベースを利用した半角カナ・全角カナの変換関数です。
■半角カナを全角カナに変換する

CREATE OR REPLACE FUNCTION uv_to_zenkaku_kana(
p_src text
) RETURNS text AS $$
DECLARE
w_from_ary text[] := '{"ヴ", "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ"}';
w_to_ary text[] := '{"ヴ", "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ"}';
w_from text := 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ゙゚。「」、・ー';
w_to text := 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ゛゜。「」、・ー';
BEGIN
RETURN uv_to_moji_henkan(p_src, w_from_ary, w_to_ary, w_from, w_to);
END;
$$ LANGUAGE plpgsql;

■全角カナを半角カナに変換する

CREATE OR REPLACE FUNCTION uv_to_hankaku_kana(
p_src text
) RETURNS text AS $$
DECLARE
w_from_ary text[] := '{"ヴ", "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ"}';
w_to_ary text[] := '{"ヴ", "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ"}';
w_from text := 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ゛゜。「」、・ー';
w_to text := 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ゙゚。「」、・ー';
BEGIN
RETURN uv_to_moji_henkan(p_src, w_from_ary, w_to_ary, w_from, w_to);
END;
$$ LANGUAGE plpgsql;

濁点と半濁点を文字列の配列にして変換して、残りの文字を一字ずつ変換しています。
以下実行例
SELECT uv_to_hankaku_kana('ユニークビジョン')
→ユニークビジョン
SELECT uv_to_zenkaku_kana('ユニークビジョン')
→ユニークビジョン
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。