ここでは、文字列内のひらがなをカタカナに、カタカナをひらがなに変換する方法を幾つか紹介します。また、半角文字を全角文字に、全角文字を半角文字に変換する方法も紹介します。
VB.NETでは、StrConv関数を使ってひらがなをカタカナに、あるいは、カタカナをひらがなに変換することができます。また、半角文字と全角文字の相互変換もできます。StrConv関数はそれ以外に、大文字と小文字の相互変換もできます。
StrConv関数でどのような変換を行うかは、2番目のパラメータに指定するVbStrConv列挙体の値で決まります。VbStrConv列挙体の値とその意味は、以下の通りです(説明は、MSDNからの抜粋です)。
メンバ名 | 説明 | 補足 |
---|---|---|
None | 変換を実行しません。 | |
Uppercase | 文字列を大文字に変換します。このメンバーは、Visual Basic の定数 vbUpperCase と等価です。 | |
Lowercase | 文字列を小文字に変換します。このメンバーは、Visual Basic の定数 vbLowerCase と等価です。 | |
ProperCase | 文字列内の各語の最初の文字を大文字に変換します。このメンバーは、Visual Basic の定数 vbProperCase と等価です。 | |
Wide | 文字列内の半角 (1 バイト) 文字を全角 (2 バイト) 文字に変換します。アジア ロケールに適用されます。このメンバーは、Visual Basic の定数 vbWide と等価です。 | 適用外のロケールで使用すると、ランタイムエラーを起こす可能性がある。 東アジアの言語のLanguage Packがインストールされているシステムで使用できる。 |
Narrow | 文字列内の全角文字を半角文字に変換します。アジア ロケールに適用されます。このメンバーは、Visual Basic の定数 vbNarrow と等価です。 | 適用外のロケールで使用すると、ランタイムエラーを起こす可能性がある。 東アジアの言語のLanguage Packがインストールされているシステムで使用できる。 |
Katakana | 文字列内のひらがなをカタカナに変換します。日本語ロケールのみに適用されます。このメンバーは、Visual Basic の定数 vbKatakana と等価です。 | 適用外のロケールで使用すると、ランタイムエラーを起こす可能性がある。 日本語Language Packがインストールされた日本語以外のシステムで使用できる。 |
Hiragana | 文字列内のカタカナをひらがなに変換します。日本語ロケールのみに適用されます。このメンバーは、Visual Basic の定数 vbHiragana と等価です。 | 適用外のロケールで使用すると、ランタイムエラーを起こす可能性がある。 日本語Language Packがインストールされた日本語以外のシステムで使用できる。 |
SimplifiedChinese | 中国語の繁体字を簡体字に変換します。このメンバーは、Visual Basic の定数 vbSimplifiedChinese と等価です。 | 適用外のロケールで使用すると、ランタイムエラーを起こす可能性がある。 |
TraditionalChinese | 中国語の簡体字を繁体字に変換します。このメンバーは、Visual Basic の定数 vbTraditionalChinese と等価です。 | 適用外のロケールで使用すると、ランタイムエラーを起こす可能性がある。 |
LinguisticCasing | 文字列に適用する大文字小文字の規則を、ファイル システムの規則から言語学的な規則に変換します。このメンバーは、Visual Basic の定数 vbLinguisticCasing と等価です。 |
このように、ひらがなからカタカナへの変換にはVbStrConv.Katakanaを、カタカナからひらがなへの変換にはVbStrConv.Hiraganaを使用します。ただしこれらの変換を行うには、システムが日本語ローケルか、日本語Language Packがインストールされている必要があります。
また、半角から全角への変換にはVbStrConv.Wideを、全角から半角への変換にはVbStrConv.Narrowを使います。この時変換される文字は、英数字、記号、カタカナのようです。ただしこの変換を行うには、システムが東アジアのローケルか、東アジアの言語のLanguage Packがインストールされている必要があります。
VbStrConvの値はビットごとの組み合わせが可能ですので、複数の変換を同時に行うこともできます。例えば、ひらがなをカタカナにして、さらに全角を半角にするには、VB.NETでは「VbStrConv.Katakana Or VbStrConv.Narrow」、C#では「VbStrConv.Katakana | VbStrConv.Narrow」とします。
StrConvは、Shift JISに無い文字を「?」にしてしまうようです。また、変換後Shift JISに無い文字になる場合も「?」に変換されるようです。よってStrConvはユニコードには対応していないと考えてよさそうです。
さらには、OSによってStrConvの返す結果が異なる場合があります。例えば、単独の濁点をVbStrConv.Wideで変換すると、Windows XPでは全角の濁点になりますが、Windows 7では「?」になります。
以下にStrConvを使って文字列を変換する例を幾つか紹介します。
'Imports Microsoft.VisualBasic Dim s As String = "あいうえおカキクケコサシスセソnaninuneno" 'ひらがなをカタカナに変換する Dim s1 As String = StrConv(s, Microsoft.VisualBasic.VbStrConv.Katakana, &H411) Console.WriteLine(s1) 'アイウエオカキクケコサシスセソnaninuneno 'カタカナをひらがなに変換する Dim s2 As String = StrConv(s, Microsoft.VisualBasic.VbStrConv.Hiragana, &H411) Console.WriteLine(s2) 'あいうえおかきくけこサシスセソnaninuneno '半角を全角に変換する Dim s3 As String = StrConv(s, Microsoft.VisualBasic.VbStrConv.Wide, &H411) Console.WriteLine(s3) 'あいうえおカキクケコサシスセソnaninuneno '全角を半角に変換する Dim s4 As String = StrConv(s, Microsoft.VisualBasic.VbStrConv.Narrow, &H411) Console.WriteLine(s4) 'あいうえおカキクケコサシスセソnaninuneno 'ひらがなをカタカナに変換し、全角を半角に変換する Dim s5 As String = StrConv(s, _ Microsoft.VisualBasic.VbStrConv.Katakana Or _ Microsoft.VisualBasic.VbStrConv.Narrow, _ &H411) Console.WriteLine(s5) 'アイウエオカキクケコサシスセソnaninuneno
string s = "あいうえおカキクケコサシスセソnaninuneno"; //ひらがなをカタカナに変換する string s1 = Microsoft.VisualBasic.Strings.StrConv( s, Microsoft.VisualBasic.VbStrConv.Katakana, 0x411); Console.WriteLine(s1); //アイウエオカキクケコサシスセソnaninuneno //カタカナをひらがなに変換する string s2 = Microsoft.VisualBasic.Strings.StrConv( s, Microsoft.VisualBasic.VbStrConv.Hiragana, 0x411); Console.WriteLine(s2); //あいうえおかきくけこサシスセソnaninuneno //半角を全角に変換する string s3 = Microsoft.VisualBasic.Strings.StrConv( s, Microsoft.VisualBasic.VbStrConv.Wide, 0x411); Console.WriteLine(s3); //あいうえおカキクケコサシスセソnaninuneno //全角を半角に変換する string s4 = Microsoft.VisualBasic.Strings.StrConv( s, Microsoft.VisualBasic.VbStrConv.Narrow, 0x411); Console.WriteLine(s4); //あいうえおカキクケコサシスセソnaninuneno //ひらがなをカタカナに変換し、全角を半角に変換する string s5 = Microsoft.VisualBasic.Strings.StrConv( s, Microsoft.VisualBasic.VbStrConv.Katakana | Microsoft.VisualBasic.VbStrConv.Narrow, 0x411); Console.WriteLine(s5); //アイウエオカキクケコサシスセソnaninuneno
マイクロソフトが配布しているライブラリ「Visual Studio International Pack」に含まれている「Japanese Kana Conversion Library」を使用して、ひらがなとカタカナの相互変換を行うことができます。また、半角カタカナと全角カタカナ(あるいは、ひらがな)の相互変換も可能です。
Japanese Kana Conversion Libraryではそれ以外に、ローマ字からひらがなへの変換もサポートしています。また、変換の方法をXMLに記述することで、独自の設定による変換も可能です。
Japanese Kana Conversion Libraryについては「.NETプログラミング研究 第85号」で詳しく説明していますので、そちらをご覧ください。
フリー(修正BSDライセンス)のクラス「kanaxs C#」あるいは「kanaxs VB.NET」を使用して、ひらがなとカタカナの相互変換を行うこともできます。また、カタカナの全角と半角の相互変換、英数字(および記号)の全角と半角の相互変換もできます。
さらに、kanaxs C#にはkanaxs拡張版もあります。
kanaxs C#とkanaxs VB.NETについて詳しくは、それぞれのページをご覧ください。
上で紹介した様々な方法には、それぞれ違いがあります。ここではその違いを調べた結果を紹介します。なおこの調査はWindows 7で行い、.NET Frameworkのバージョンは4.0、Visual Studio International Packのバージョンは1.0 SR1、kanaxsのバージョンは1.0.0、kanaxs拡張版のバージョンは1.0.1です。
まずは、ひらがなからカタカナへ変換する際の違いを表にまとめます。なお「StrConv」の「メソッド」欄は、使用するVbStrConv列挙体の値になっています。
名前 | メソッド | 説明 |
---|---|---|
StrConv | VbStrConv.Katakana | 「ゕ」(小さい「か」)と「ゖ」(小さい「け」)が「?」に変換される。U+3099の濁点とU+309Aの半濁点が「?」に変換される。 |
Japanese Kana Conversion Library | KanaConverter.HiraganaToKatakana | U+3099の濁点とU+309Aの半濁点が前の文字と合体できる時は合体して1つの文字になる。 |
kanaxs | Kana.ToKatakana | 「ゝ」と「ゞ」の変換を行わない。 |
kanaxs拡張版 | KanaEx.ToKatakana |
以下に、それぞれの方法でひらがなをカタカナに変換するコードを示します。
'Imports Microsoft.VisualBasic Dim s As String = "ぁ" + ChrW(&H3094) + ChrW(&H3095) + ChrW(&H3096) + _ "は" + ChrW(&H3099) + "は" + ChrW(&H309A) + "は゛は゜ゝゞ" 'ひらがなをカタカナに変換する 'StrConvで変換する Dim s1 As String = StrConv(s, Microsoft.VisualBasic.VbStrConv.Katakana, &H411) Console.WriteLine(s1) 'ァヴ??ハ?ハ?ハ゛ハ゜ヽヾ 'Japanese Kana Conversion Libraryで変換する Dim s2 As String = _ Microsoft.International.Converters.KanaConverter.HiraganaToKatakana(s) Console.WriteLine(s2) 'ァヴヵヶバパハ゛ハ゜ヽヾ 'kanaxsで変換する Dim s3 As String = VisualBasic.Japanese.Kanaxs.Kana.ToKatakana(s) Console.WriteLine(s3) 'ァヴヵヶハ\u3099ハ\u309Aハ゛ハ゜ゝゞ
//Microsoft.VisualBasic.dll が参照設定に追加されている必要がある string s = "ぁ\u3094\u3095\u3096は\u3099は\u309Aは゛は゜ゝゞ"; //ひらがなをカタカナに変換する //StrConvで変換する string s1 = Microsoft.VisualBasic.Strings.StrConv( s, Microsoft.VisualBasic.VbStrConv.Katakana, 0x411); Console.WriteLine(s1); //ァヴ??ハ?ハ?ハ゛ハ゜ヽヾ //Japanese Kana Conversion Libraryで変換する string s2 = Microsoft.International.Converters.KanaConverter.HiraganaToKatakana(s); Console.WriteLine(s2); //ァヴヵヶバパハ゛ハ゜ヽヾ //kanaxsで変換する string s3 = CSharp.Japanese.Kanaxs.Kana.ToKatakana(s); Console.WriteLine(s3); //ァヴヵヶハ\u3099ハ\u309Aハ゛ハ゜ゝゞ //kanaxs拡張版で変換する string s4 = CSharp.Japanese.Kanaxs.KanaEx.ToKatakana(s); Console.WriteLine(s4); //ァヴヵヶハ\u3099ハ\u309Aハ゛ハ゜ヽヾ
名前 | メソッド | 説明 |
---|---|---|
StrConv | VbStrConv.Hiragana | Windows 7では、「ヵ」と「ヶ」が「?」に変換される(それ以前のOSでは「ヵ」と「ヶ」を変換しない?)。+3099の濁点とU+309Aの半濁点が「?」に変換される。「ヴ」を変換しない。「ゔ」(ひらがなの「ヴ」)を「ヴ」に変換する。 |
Japanese Kana Conversion Library | KanaConverter.KatakanaToHiragana | U+3099の濁点とU+309Aの半濁点が前の文字と合体できる時は合体して1つの文字になる。 |
kanaxs | Kana.ToHiragana | 「ヽ」と「ヾ」の変換を行わない。 |
kanaxs拡張版 | KanaEx.ToHiragana | 「ヷ」(「ワ」に濁点)「ヸ」(「ヰ」に濁点)「ヹ」(「ヱ」に濁点)「ヺ」(「ヲ」に濁点)も変換する。 |
名前 | メソッド | 説明 |
---|---|---|
StrConv | VbStrConv.Wide | 半角の英数字、記号、カタカナを変換する。「"」を「"」(U+FF02)に、「'」を「'」(U+FF07)に変換する。「\」は変換しない。濁点と半濁点は、半角全角を問わず、前の文字と合体できる時は合体して1つの文字になる。Windows 7では、合体できない単独の濁点と半濁点が「?」に変換される。U+3099の濁点とU+309Aの半濁点は「?」に変換される。「ゔ」(ひらがなの「ヴ」)を「ヴ」に変換する。 |
Japanese Kana Conversion Library | KanaConverter.HalfwidthKatakanaToKatakana | 半角カタカナを全角カタカナに変換する。「ー」は変換しない。濁点と半濁点(U+3099の濁点とU+309Aの半濁点を含む)は前の文字と合体できる時は合体して1つの文字になる。合体できない単独の濁点と半濁点は変換しない。 |
KanaConverter.HalfwidthKatakanaToHiragana | 半角カタカナをひらがなに変換する。「ー」は変換しない。濁点と半濁点(U+3099の濁点とU+309Aの半濁点を含む)は前の文字と合体できる時は合体して1つの文字になる。合体できない単独の濁点と半濁点は変換しない。 | |
kanaxs | Kana.ToZenkaku | 半角英数字および記号を全角に変換する。「\」を「\」(U+FF3C)に、「"」を「"」(U+FF02)に、「'」を「'」(U+FF07)に変換する。 |
Kana.ToZenkakuKana | 半角カタカナを全角カタカナに変換する。半角の濁点と半濁点は全角に変換するだけで、前の文字と合体しない(ToPaddingメソッドにより、前の文字に吸収されて1つの文字にすることができる)。 | |
kanaxs拡張版 | KanaEx.ToZenkaku | 半角英数字および記号を全角に変換する。「\」を「¥」(U+FFE5)に、「"」を「”」(U+201D)に、「'」を「’」(U+2019)に変換する。 |
KanaEx.ToZenkakuKana | 半角カタカナを全角カタカナに変換する。濁点と半濁点(U+3099の濁点とU+309Aの半濁点を含む)は前の文字と合体できる時は合体して1つの文字になる。単独の濁点、半濁点や『ー・。、「」』も全角に変換する。 |
名前 | メソッド | 説明 |
---|---|---|
StrConv | VbStrConv.Narrow | 全角の英数字、記号、カタカナを半角に変換する。「\」は変換しない。U+3099の濁点とU+309Aの半濁点は「?」に変換される。「ゔ」(ひらがなの「ヴ」)を「ヴ」に変換する。(9x系OSでは、「"」(U+FF02)と「'」(U+FF07)の変換を行わない?) |
Japanese Kana Conversion Library | KanaConverter.KatakanaToHalfwidthKatakana | 全角カタカナを半角カタカナに変換する。「ー」は変換しない。U+3099の濁点とU+309Aの半濁点も半角カタカナに変換する。 |
KanaConverter.HiraganaToHalfwidthKatakana | ひらがなを半角カタカナに変換する。「ー」は変換しない。U+3099の濁点とU+309Aの半濁点も半角カタカナに変換する。 | |
kanaxs | Kana.ToHankaku | 全角英数字および記号を半角に変換する。「¥」(U+FFE5)、「“」(U+201C)、「”」(U+201D)、「‘」(U+2018)、「’」(U+2019)は変換しない。 |
Kana.ToHankakuKana | 全角カナ文字を半角カナ文字に変換する。U+3099の濁点とU+309Aの半濁点は変換しない。 | |
kanaxs拡張版 | KanaEx.ToHankaku | 全角英数字および記号を半角に変換する。 |
KanaEx.ToHankakuKana | 全角カナ文字を半角カナ文字に変換する。U+3099の濁点とU+309Aの半濁点も半角カタカナに変換する。『「」、・』も変換する。 |
ひらがなからカタカナに変換する時、どの方法が最も高速であるかを以下のようなコードで試してみました。
'Imports Microsoft.VisualBasic '1000文字のひらがなを作成する Dim s As String = "きょうはてんきがいい" Dim sb As New System.Text.StringBuilder(1000) For i As Integer = 0 To 100 sb.Append(s) Next s = sb.ToString() '繰り返す回数 Dim maxCount As Integer = 1000 'ひらがなをカタカナに変換する 'StrConvで変換する Dim s1 As String = "" Dim sw1 As New System.Diagnostics.Stopwatch() sw1.Start() For i As Integer = 0 To maxCount - 1 s1 = StrConv(s, Microsoft.VisualBasic.VbStrConv.Katakana, &H411) Next sw1.Stop() Console.WriteLine(sw1.ElapsedTicks) '161182 'Japanese Kana Conversion Libraryで変換する Dim s2 As String = "" Dim sw2 As New System.Diagnostics.Stopwatch() sw2.Start() For i As Integer = 0 To maxCount - 1 s2 = Microsoft.International.Converters.KanaConverter.HiraganaToKatakana(s) Next sw2.Stop() Console.WriteLine(sw2.ElapsedTicks) '17892002: 'kanaxsで変換する Dim s3 As String = "" Dim sw3 As New System.Diagnostics.Stopwatch() sw3.Start() For i As Integer = 0 To maxCount - 1 s3 = VisualBasic.Japanese.Kanaxs.Kana.ToKatakana(s) Next sw3.Stop() Console.WriteLine(sw3.ElapsedTicks) '35200: Console.WriteLine(s1) Console.WriteLine(s2) Console.WriteLine(s3)
//Microsoft.VisualBasic.dll が参照設定に追加されている必要がある //1000文字のひらがなを作成する string s = "きょうはてんきがいい"; System.Text.StringBuilder sb = new System.Text.StringBuilder(1000); for (int i = 0; i < 100; i++) { sb.Append(s); } s = sb.ToString(); //繰り返す回数 int maxCount = 1000; //ひらがなをカタカナに変換する //StrConvで変換する string s1 = ""; System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch(); sw1.Start(); for (int i = 0; i < maxCount; i++) { s1 = Microsoft.VisualBasic.Strings.StrConv( s, Microsoft.VisualBasic.VbStrConv.Katakana, 0x411); } sw1.Stop(); Console.WriteLine(sw1.ElapsedTicks); //164806 //Japanese Kana Conversion Libraryで変換する string s2 = ""; System.Diagnostics.Stopwatch sw2 = new System.Diagnostics.Stopwatch(); sw2.Start(); for (int i = 0; i < maxCount; i++) { s2 = Microsoft.International.Converters.KanaConverter. HiraganaToKatakana(s); } sw2.Stop(); Console.WriteLine(sw2.ElapsedTicks); //17554152 //kanaxsで変換する string s3 = ""; System.Diagnostics.Stopwatch sw3 = new System.Diagnostics.Stopwatch(); sw3.Start(); for (int i = 0; i < maxCount; i++) { s3 = CSharp.Japanese.Kanaxs.Kana.ToKatakana(s); } sw3.Stop(); Console.WriteLine(sw3.ElapsedTicks); //23870 //kanaxs拡張版で変換する string s4 = ""; System.Diagnostics.Stopwatch sw4 = new System.Diagnostics.Stopwatch(); sw4.Start(); for (int i = 0; i < maxCount; i++) { s4 = CSharp.Japanese.Kanaxs.KanaEx.ToKatakana(s); } sw4.Stop(); Console.WriteLine(sw4.ElapsedTicks); //23580 Console.WriteLine(s1); Console.WriteLine(s2); Console.WriteLine(s3); Console.WriteLine(s4);
この結果では、kanaxsとkanaxs拡張版が一番速かったです。一方Japanese Kana Conversion Libraryは圧倒的に遅く、StrConvの100倍以上も遅かったです。
なおこの結果はあくまで私の環境での結果ですので、別の環境や条件では違った結果になる可能性もあります。