半角文字を全角文字に変換
以下のコードをそのままC#またはVBには移植不可
F#のための軽そう?なコードを自作してみました。
■実行結果
> "゙ア゙イヴエオ゙".StrCnv();; > リアル: 00:00:00.000、CPU: 00:00:00.000、GC gen0: 0, gen1: 0, gen2: 0 val it : System.String = "゛ア゛イヴエオ゛"
■コード
module StringCommon = let private map = Seq.cache <| seq { yield ('!','!') yield ('"','”') yield ('#','#') yield ('$','$') yield ('%','%') yield ('&','&') yield ('\'','’') yield ('(','(') yield (')',')') yield ('*','*') yield ('+','+') yield (',',',') yield ('-','−') yield ('.','.') yield ('/','/') yield (':',':') yield (';',';') yield ('<','<') yield ('=','=') yield ('>','>') yield ('?','?') yield ('@','@') yield ('A','A') yield ('B','B') yield ('C','C') yield ('D','D') yield ('E','E') yield ('F','F') yield ('G','G') yield ('H','H') yield ('I','I') yield ('J','J') yield ('K','K') yield ('L','L') yield ('M','M') yield ('N','N') yield ('O','O') yield ('P','P') yield ('Q','Q') yield ('R','R') yield ('S','S') yield ('T','T') yield ('U','U') yield ('V','V') yield ('W','W') yield ('X','X') yield ('Y','Y') yield ('Z','Z') yield ('[','[') yield ('\\','¥') yield (']',']') yield ('^','^') yield ('_','_') yield ('`','‘') yield ('a','a') yield ('b','b') yield ('c','c') yield ('d','d') yield ('e','e') yield ('f','f') yield ('g','g') yield ('h','h') yield ('i','i') yield ('j','j') yield ('k','k') yield ('l','l') yield ('m','m') yield ('n','n') yield ('o','o') yield ('p','p') yield ('q','q') yield ('r','r') yield ('s','s') yield ('t','t') yield ('u','u') yield ('v','v') yield ('w','w') yield ('x','x') yield ('y','y') yield ('z','z') yield ('{','{') yield ('|','|') yield ('}','}') yield ('~',' ̄') yield ('`','`') yield ('〜','〜') yield ('。','。') yield ('「','「') yield ('」','」') yield ('、','、') yield ('・','・') yield ('ヲ','ヲ') yield ('ァ','ァ') yield ('ィ','ィ') yield ('ゥ','ゥ') yield ('ェ','ェ') yield ('ォ','ォ') yield ('ャ','ャ') yield ('ュ','ュ') yield ('ョ','ョ') yield ('ッ','ッ') yield ('ー','ー') yield ('ア','ア') yield ('イ','イ') yield ('ウ','ウ') yield ('エ','エ') yield ('オ','オ') yield ('カ','カ') yield ('キ','キ') yield ('ク','ク') yield ('ケ','ケ') yield ('コ','コ') yield ('サ','サ') yield ('シ','シ') yield ('ス','ス') yield ('セ','セ') yield ('ソ','ソ') yield ('タ','タ') yield ('チ','チ') yield ('ツ','ツ') yield ('テ','テ') yield ('ト','ト') yield ('ナ','ナ') yield ('ニ','ニ') yield ('ヌ','ヌ') yield ('ネ','ネ') yield ('ノ','ノ') yield ('ハ','ハ') yield ('ヒ','ヒ') yield ('フ','フ') yield ('ヘ','ヘ') yield ('ホ','ホ') yield ('マ','マ') yield ('ミ','ミ') yield ('ム','ム') yield ('メ','メ') yield ('モ','モ') yield ('ヤ','ヤ') yield ('ユ','ユ') yield ('ヨ','ヨ') yield ('ラ','ラ') yield ('リ','リ') yield ('ル','ル') yield ('レ','レ') yield ('ロ','ロ') yield ('ワ','ワ') yield ('ン','ン') yield ('゙','゛') yield ('゚','゜') } let private dmap = Seq.cache <| seq { yield (('カ','゙'),'ガ') yield (('キ','゙'),'ギ') yield (('ク','゙'),'グ') yield (('ケ','゙'),'ゲ') yield (('コ','゙'),'ゴ') yield (('サ','゙'),'ザ') yield (('シ','゙'),'ジ') yield (('ス','゙'),'ズ') yield (('セ','゙'),'ゼ') yield (('ソ','゙'),'ゾ') yield (('タ','゙'),'ダ') yield (('チ','゙'),'ヂ') yield (('ツ','゙'),'ヅ') yield (('テ','゙'),'デ') yield (('ト','゙'),'ド') yield (('ハ','゙'),'バ') yield (('ハ','゚'),'パ') yield (('ヒ','゙'),'ビ') yield (('ヒ','゚'),'ピ') yield (('フ','゙'),'ブ') yield (('フ','゚'),'プ') yield (('ヘ','゙'),'ベ') yield (('ヘ','゚'),'ペ') yield (('ホ','゙'),'ボ') yield (('ホ','゚'),'ポ') yield (('ウ','゙'),'ヴ') } /// charの初期値として使用 let private cn = '\000' /// 全角へ変換 let private fwtransfer c = map |> Seq.tryFind(fst >> (=)c) |> (fun o -> if o.IsSome then snd o.Value else c) /// 濁点半濁点が続く半角2文字を全角文字に変換 let private dfwtransfer t = dmap |> Seq.tryFind(fst >> (=)t) |> (fun o -> if o.IsSome then Some <| snd o.Value else None) /// 配列を文字列に変換 let private toString (arr:char[]) = System.String(arr) type System.String with member x.StrCnv() = // x |> Seq.map fwtransfer |> Seq.toArray |> toString // 半角1文字を全角にする x |> Seq.fold (fun (l,(a,b)) c -> match (a,b) with | ('\000',_) | (_,'\000') -> l,(b,c) | t -> match (dfwtransfer t) with | Some d -> l@[d],(cn,c) | None -> l@[fwtransfer a],(b,c) ) ([],(cn,cn)) // ↓がなんとかならないのか・・・ださい! |> (fun (l,(a,b)) -> match (a,b) with | ('\000',b) -> l,[b] | (a,'\000') -> l,[a] | (a,b) -> l,[a;b;] |> (fun (l,l2) -> l2 |> List.map fwtransfer |> List.append l |> List.toArray) |> toString )
//