C#での文字列の半角全角変換

VisualBasicのクラスを利用するとよいようだ。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10448&forum=7
使う際には、参照の追加で、.NETのMicrosoft.VisualBasicを追加してやる。

using Microsoft.VisualBasic;

(略)

string s = Strings.StrConv("アイウエオ", VbStrConv.Narrow, 0);

半角→全角と小文字→大文字変換と同時にやる場合は、次のように書く。

string s = Strings.StrConv("Abc証券", VbStrConv.Uppercase | VbStrConv.Wide, 0);
追記:2009/10/05

これUnicodeで文字を扱っている場合、悲惨なことになる。
どうも内部でCodePage932に変換しているのか……。Unicode固有文字が化ける。そのせいでえらい目にあった……。
上の方法は自分では二度と使わない。

追記:2011/04/21

("half width"、"full width"を半角、全角と書くのは正確じゃないな……と、いまさらながらに思ったが、気にしない。)
他に影響がでないように、文字列中の半角文字だけ引っかけて全角文字への変換を行ってもひどいことになる場合が出てきた。たとえば半角の濁点半濁点を「単体」で変換する。これらはU+FF9E(半角濁点)、U+FF9F(半角半濁点)なわけだ。んで、変換先はU+309B(全角濁点)、U+309C(全角半濁点)となるだろう。そう思うわけだが……。そして、あるところまでのWindowsはそうだった。Windows 7*1では、しかし、U+3099(合成用全角濁点)、U+309A(合成用全角半濁点)と考えてくれるようだ。そして、合成用の全角濁点半濁点は……、CodePage932(SJISのMS亜種)にはないよねーってことで、'?'になって返ってくる。だから、Strings.StrConv("゛゜", VbStrConv.Wide, 0) からは"??"が返ってくる(例の文字列中の濁点半濁点は全角文字にしてる。試す時は半角にして試して欲しい)。単体で、濁点、半濁点なんて変換しないから問題ない? 顔文字なんかには濁点半濁点が単体で使われてるなんて珍しくないから、たとえばいろんなテキストデータを処理する、その前段階として文字列の全角への統一を行うとする。それにStrings.StrConv()メソッドつかったら、顔文字中の濁点や半濁点が化けたりするよ?
自分のプログラムではStrings.StrConv()は使っていないが……。人のところで使われていてな……。MSは抜本的にStrings.StrConv()を修正するか、使用禁止ってドキュメントに書けよ……。

*1:SP1を当てたあと。当てる前は知らないが……。ころころ変えねえでくれって部分だし、結局SP1とかは当てることになっていくだろうから、SP1当てる当てないはあまり関係ないかな。