DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ひらがなとカタカナ、全角と半角の変換を行う

ここでは、文字列内のひらがなをカタカナに、カタカナをひらがなに変換する方法を幾つか紹介します。また、半角文字を全角文字に、全角文字を半角文字に変換する方法も紹介します。

VB.NETのStrConv関数を使う

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を使って文字列を変換する例を幾つか紹介します。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
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を使う

マイクロソフトが配布しているライブラリ「Visual Studio International Pack」に含まれている「Japanese Kana Conversion Library」を使用して、ひらがなとカタカナの相互変換を行うことができます。また、半角カタカナと全角カタカナ(あるいは、ひらがな)の相互変換も可能です。

Japanese Kana Conversion Libraryではそれ以外に、ローマ字からひらがなへの変換もサポートしています。また、変換の方法をXMLに記述することで、独自の設定による変換も可能です。

Japanese Kana Conversion Libraryについては「.NETプログラミング研究 第85号」で詳しく説明していますので、そちらをご覧ください。

kanaxsを使用する

フリー(修正BSDライセンス)のクラス「kanaxs C#」あるいは「kanaxs VB.NET」を使用して、ひらがなとカタカナの相互変換を行うこともできます。また、カタカナの全角と半角の相互変換、英数字(および記号)の全角と半角の相互変換もできます。

さらに、kanaxs C#にはkanaxs拡張版もあります。

kanaxs C#kanaxs VB.NETについて詳しくは、それぞれのページをご覧ください。

StrConv、Japanese Kana Conversion Library、kanaxsの違い

上で紹介した様々な方法には、それぞれ違いがあります。ここではその違いを調べた結果を紹介します。なおこの調査は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

以下に、それぞれの方法でひらがなをカタカナに変換するコードを示します。

VB.NET
コードを隠すコードを選択
'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ハ゛ハ゜ゝゞ
C#
コードを隠すコードを選択
//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 半角の英数字、記号、カタカナを変換する。「"」を「W」(U+FF02)に、「'」を「V」(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)に、「"」を「W」(U+FF02)に、「'」を「V」(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では、「W」(U+FF02)と「V」(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の半濁点も半角カタカナに変換する。『「」、・』も変換する。

どの方法が一番速いか

ひらがなからカタカナに変換する時、どの方法が最も高速であるかを以下のようなコードで試してみました。

VB.NET
コードを隠すコードを選択
'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)
C#
コードを隠すコードを選択
//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倍以上も遅かったです。

なおこの結果はあくまで私の環境での結果ですので、別の環境や条件では違った結果になる可能性もあります。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。