雑記
 

Kana.NET での ひらがな・カタカナ変換

2021/11/14

この記事が対象とする製品・バージョン

Visual Basic/C# を含む .NET 言語。 .NET Core 3.1、.NET 5、.NET 6。

目次

 

Kana.NET

ひらがなとカタカナの変換 と 全角と半角変換ができるパッケージ Kana.NET を公開しました。

NuGet から取得できます。初心者向けの手順はアプリケーションにKana.NETを組み込む方法で後述します。

Kana.NET を使用すると次のようなプログラムができます。

Visual Baisc での 使用例

'カタカナ→ひらがな変換。「どらえもん大好き」になります。
Dim hiragana As String = Umayadia.Kana.KanaConverter.ToHiragana("ドラえもん大好き")

'ひらがな→カタカナ変換。「ドラエモン大好キ」になります。
Dim katakana As String = Umayadia.Kana.KanaConverter.ToKatakana("ドラえもん大好き")

'半角→全角変換。「機動戦士ガンダム」になります。
Dim zenkaku As String = Umayadia.Kana.KanaConverter.ToWide("機動戦士ガンダム")

'全角→半角変換。「機動戦士ガンダム」
Dim hankaku As String = Umayadia.Kana.KanaConverter.ToNarrow("機動戦士ガンダム")

Console.WriteLine($"{hiragana} {katakana} {zenkaku} {hankaku}")

C# での 使用例

//カタカナ→ひらがな変換。「どらえもん大好き」になります。
string hiragana = Umayadia.Kana.KanaConverter.ToHiragana("ドラえもん大好き");

//ひらがな→カタカナ変換。「ドラエモン大好キ」になります。
string katakana = Umayadia.Kana.KanaConverter.ToKatakana("ドラえもん大好き");

//全角→半角変換。「機動戦士ガンダム」
string zenkaku = Umayadia.Kana.KanaConverter.ToWide("機動戦士ガンダム");

//全角→半角変換。「機動戦士ガンダム」
string hankaku = Umayadia.Kana.KanaConverter.ToNarrow("機動戦士ガンダム");

Console.WriteLine($"{hiragana} {katakana} {zenkaku} {hankaku}");

 

Kana.NET の特徴

Kana.NET のメリット

Kana.NET の使用には次のようなメリットがあります。

 

VB/C#のどちらでも利用できます。また、コンソールアプリケーション、ASP.NET Webアプリケーションなどアプリケーションの種類を問わず利用できます。

 

Kana.NET の制限事項

.NET Core 3.1、.NET 5、.NET 6 で作成したプロジェクトでのみ Kana.NET を使用できます。

.NET Core 3.0以前や .NET Framework では使用できません。

 

非日本語環境で動作できることがもたらす価値

非日本語環境のWindowsやLinuxでも実行できるということは、クラウド(AWS, Azure, GCP)などのマネージドなホスティング環境でも動作させることができるということです。

たとえば、AWSの Lambda や Azure の GCPのCloud Run や Azure の AppServices などでも実行できるはずです(試してはいません)。クラウド上の既定の仮想マシン(VM)は非日本語環境ですが、これでもそのまま動作します(試してはいません)。

 

StrConv が使えない理由

ひらがな・カタカナ変換機能は Microsoft.VisualBasic.Strings.StrConv でも利用できます。参照設定すれば C# からも呼び出せます。

しかし、StrConvは機能が古く、制限が多くなっており2021年現在では限定的な状況でしか使用できません。具体的には日本語環境のWindowsで、ShiftJISで定義されている範囲の文字だけを扱う場合です。20年前は日本国内ではこの制限はそれほど厳しくありませんでしたが、現在ではこの制限がクラウドなどで使用する場合に大きな足かせになります。

 

リファレンス

Kana.NET 1.0.6 には以下の機能があります。

すべての機能は Umayadia.Kana.Kana.Converterクラスの静的メンバー(VB用語では共有メンバー)から呼び出せます。

Umayadia.Kana.KanaConverter クラス

ToHiraganaメソッド

引数の文字列に含まれるカタカナをひらがなに変換した文字列を返します。カタカナ以外は何も変換しません。

静的メソッド(VB用語では共有メソッド)です。

変換の詳細は、後述するひらがな・カタカナ変換の詳細を参照してください。

ToKatakanaメソッド

引数の文字列に含まれるひらがなをカタカナに変換した文字列を返します。ひらがな以外は何も変換しません。

静的メソッド(VB用語では共有メソッド)です。

変換の詳細は、後述するひらがな・カタカナ変換の詳細を参照してください。

ToWideメソッド

引数の文字列に含まれる半角文字を全角文字に変換した文字列を返します。半角文字以外は何も変換します。

静的メソッド(VB用語では共有メソッド)です。

変換の詳細は、後述する全角・半角変換の詳細を参照してください。

ToNarrowメソッド

引数の文字列に含まれる全角文字を半角文字に変換した文字列を返します。全角文字以外は何も変換します。

静的メソッド(VB用語では共有メソッド)です。

変換の詳細は、後述する全角・半角変換の詳細を参照してください。

StrConvメソッド

通常は使用しないでください。Microsoft.VisualBasic.String.StrConvと同じ結果になるように文字列をひらがなまたはカタカナに変換します。StrConvとの互換性が必要な場合のみ利用してください。ひらがな・カタカナ以外の変換はできません。

詳細は、StrConvとの互換性が必要な場合の特別機能を参照してください。

MapToHiraganaプロパティ

ToHiraganaメソッドの変換にカスタムな定義を適用します。詳細は、後述する カスタム変換の定義 を参照してください。

静的プロパティ(VB用語では共有プロパティ)です。

MapToKatakanaプロパティ

ToKatakanaメソッドの変換にカスタムな定義を適用します。詳細は、後述する カスタム変換の定義 を参照してください。

静的プロパティ(VB用語では共有プロパティ)です。

 

アプリケーションに Kana.NET を組み込む方法

概要

Kana.NET を組み込むには NuGet からインストールするだけです。

以下では、初心者向けにその手順を説明します。

Visual Studio 2022 で操作しながらこの手順を書いたので、他のバージョンでは画面の表示など少し違うかもしれません。

画像付きの手順は下記でも公開しています。

NuGet でパッケージをインストールする方法

 

 

手順1.Visual Studio で対象のプロジェクトを右クリックし「Nuget パッケージの管理」を選択します。

 

手順2.パッケージソールが nuget.org になっていることを確認し、左上の「参照」をクリックします。

NuGetパッケージの管理

 

手順3.検索欄に Kana.NET と入力して、Enter を押します。

 

手順4.Kana.NET をクリックし、右側のインストールをクリックします。

この「インストール」とは、このプロジェクトにKana.NETを組み込むという意味であり、Windowsになにかがインストールされるわけではありません。影響を受けるのはこのプロジェクトだけです。

 

確認画面が出てくるので、「OK」や「同意する」を選択してください。

個人利用だけでなく商用利用も無料で可能です。私はいかなる責任も負いません。配布する場合(つまり、Kana.NETを利用して作ったものを他の人に渡す場合)は私(rucio)の著作権を「Copyright 2021 rucio https://github.com/rucio-rucio/Kana.NET」のように表記して配布物に含め、ライセンスがMITライセンスであるということも記述して配布物に含めてください。この使用条件に同意できない場合は同意するを選択しないでください。

 

手順5.確認

以上で、Kana.NET はプロジェクトに組み込まれました。

ソリューションエクスプローラーで組み込まれていることを確認できます。

 

次のようにプログラムすると、ひらがな・カタカナ変換を試してみることができます。このページの冒頭のサンプルと同じです。

Visual Baisc での カタカナ → ひらがな 変換の サンプル

Dim hiragana As String = Umayadia.Kana.KanaConverter.ToHiragana("ドラえもん大好き")
Console.WriteLine(hiragana) 'どらえもん大好き

C# での カタカナ → ひらがな 変換の サンプル

string hiragana = Umayadia.Kana.KanaConverter.ToHiragana("ドラえもん大好き");
Console.WriteLine(hiragana);

 

Visual Baisc での ひらがな → カタカナ 変換の サンプル

Dim katakana As String = Umayadia.Kana.KanaConverter.ToKatakana("ドラえもん大好き")
Console.WriteLine(katakana) 'ドラエモン大好キ

C# での ひらがな → カタカナ 変換の サンプル

string katakana = Umayadia.Kana.KanaConverter.ToKatakana("ドラえもん大好き");
Console.WriteLine(katakana);

 

ひらがな・カタカナ 変換の詳細

Kana.NET/KanaConverterTest.cs at main · rucio-rucio/Kana.NET (github.com)

 

全角・半角変換の詳細

Kana.NETでは、日本語環境のプログラマーが想定している通りに全角・半角変換できるように配慮しました。私の配慮が正しければ、この記事を読んでいる日本語話者のあなたが想像した通りに全角・半角変換します。

 

半角文字には半角ドイツ語や半角ハングル(韓国語)など、いろいろな種類があります。

※「半角」の定義は複雑なのでここでは立ち入らないこととします。

Kana.NETでは日本語処理に便利なように全角・半角変換を行います。ドイツ語や韓国語などの変換は行いません。

具体的にどの文字がどの文字に変換されるかは、Kana.NETのテストプログラムで確認できます。

Kana.NET/KanaConverterWideNarrowTest.cs at main · rucio-rucio/Kana.NET (github.com)

 

ポイントとなる変換は次の通りです

 

半角バックスラッシュ と 全角円マーク を対応させる理由

半角バックスラッシュ(U+005C)は、日本語のフォントの多くが半角円マークの形のフォントを割り当てており、日本語環境では円マークの代わりに使用されます。日本以外の環境では、このフォントには円マークではない記号が割り当てられており、U+005Cが円マークであるという理解は日本語環境でしか通用しません(ひょっとして中国語も?)。しかし、日本語環境では半角バックスラッシュを全角バックスラッシュに変換するよりも、全角円マークに変換したいという需要の方が圧倒多数であると考え、Kana.NETでは全角円マーク「¥」に変換することとしています。同様に全角円マークを半角に変換すると、半角バックスラッシュ(U+005C)に変換します。Kana.NET以外の全角半角変換機能での半角バックスラッシュの変換結果はKana.NETとは異なるかもしれません。

なお、Uniococe では、半角円マークは U+00A5 で定義されていますが、日本語環境ではこちらはほとんど使われていません。Kana.NETではこれを全角に変換しても全角円マークに変換します。が、そこから全角円マークを半角にすると半角バックスラッシュ(U+005C)になるので元に戻りません。

 

カスタム変換の定義

「ヷ」「ヸ」「ヹ」「ヺ」 を 「わ゙」「ゐ゙」「ゑ゙」「を゙」に変換したい場合や、何か他のカタカナ・ひらがな変換のライブラリ・パッケージとの互換性目的で、Kana.NETの変換結果を一部変更したい場合は、カスタムな変換を定義できます。

MapToHiraganaプロパティに関数を設定してあると、KanaConverter.ToHiraganaメソッドは、対象の文字列を1文字ごとに設定してある関数を呼び出します。この関数の中で、何に変換するか決定します。

MapToHiraganaプロパティにセットした関数は、それ以降のすべてのToHiraganaメソッドの呼び出しで有効ですので、1度設定するだけで全体に影響します。設定を初期状態に戻すには null (VBではNothing)をセットします。

ToKatakanaメソッドによるカタカナ変換についても同じようにMapToKatakanaプロパティを利用できます。使い方は同じなのでここではMapToHiraganaの例で説明します。

たとえば、次のVisual Basicのプログラムは「ヷ」「ヸ」「ヹ」「ヺ」 を 「わ゙」「ゐ゙」「ゑ゙」「を゙」に変換します。

Umayadia.Kana.KanaConverter.MapToHiragana =
    Sub(builder As System.Text.StringBuilder, letter As String, suggestion As String, source As String)
        Select Case letter
            Case "ヷ"
                builder.Append("わ゙")
            Case "ヸ"
                builder.Append("ゐ゙")
            Case "ヹ"
                builder.Append("ゑ゙")
            Case "ヺ"
                builder.Append("を゙")
            Case Else
                builder.Append(suggestion)
        End Select
    End Sub

Dim result5 As String = Umayadia.Kana.KanaConverter.ToHiragana("ワヷヰヸヱヹヲヺ")
Console.WriteLine(result5) 'わわ゙ゐゐ゙ゑゑ゙をを゙

C# ではたとえば次のように書けます。

Umayadia.Kana.KanaConverter.MapToHiragana =
    (System.Text.StringBuilder builder, string letter, string suggestion, string source) =>
    {
        builder.Append(letter switch
        {
            "ヷ" => "わ゙",
            "ヸ" => "ゐ゙",
            "ヹ" => "ゑ゙",
            "ヺ" => "を゙",
            _ => suggestion
        });
    };

string result5 = Umayadia.Kana.KanaConverter.ToHiragana("ワヷヰヸヱヹヲヺ");
Console.WriteLine(result5); //わわ゙ゐゐ゙ゑゑ゙をを゙

この関数の引数の意味は次の通りです。

builder

変換後の文字列のバッファーです。最終的にこのStringBuilderの内容が変換後の文字列になります。

カスタム変換用の関数ではバッファーを直接操作できるのでAppend以外の操作も可能です。

letter

この文字に対する変換を定義してください。つまり変換前の文字であるともいえます。

suggestion

Kana.NETが提案する変換後の文字です。カスタムな変換が不要な場合は、この文字をそのままbuilderにAppendしてください。

source

変換を行おうとしている文字列全体です。

 

StrConvとの互換性が必要な場合の特別機能

前述したようにMicrosoft.VisualBasic.Strings.StrConv はUnicode対応ではなかったり、使える環境が制限されていたりするのですが、長い間使われてきた実績があり、これらの制限を承知でうまくプログラムで補っているシステムやプログラムもあることでしょう。

それにVB6時代のStrConvやVBAのStrConvとの互換性が必要な場合もあるかもしれません。

そこで、Kana.NET では、StrConv と同じ変換結果になるようその名も同じ StrConv というメソッドも提供しています。

StrConvと同じ変換結果ではありますが、Kana.NETに組み込まれているため、非日本語環境でも動作しますし、Linux/Macでも動作する点で、Microsoft.VisualBasic.Strings.StrConvとは異なります。

繰り返しになりますが、通常 StrConv の使用はお勧めではありません。互換性目的の場合のみご利用ください。

 

下記の例では「𩸽」が「??」に変換されます。

VB で StrConv と同じ結果になるようにひらがな変換する例

Dim result6 As String = Umayadia.Kana.KanaConverter.StrConv("ドラえもんは𩸽が大好き", vbHiragana)
Console.WriteLine(result6) 'どらえもんは??が大好き

C# で StrConv と同じ結果になるようにひらがな変換する例

string result6 = Umayadia.Kana.KanaConverter.StrConv("ドラえもんは𩸽が大好き", Umayadia.Kana.umaStrConv.Hiragana);
Console.WriteLine(result6); //どらえもんは??が大好き

 

VB で StrConv と同じ結果になるようにカタカナ変換する例

Dim result7 As String = Umayadia.Kana.KanaConverter.StrConv("ドラえもんは𩸽が大好き", vbKatakana)
Console.WriteLine(result7) 'ドラエモンハ??ガ大好キ

C# で StrConv と同じ結果になるようにひらがな変換する例

string result7 = Umayadia.Kana.KanaConverter.StrConv("ドラえもんは𩸽が大好き", Umayadia.Kana.umaStrConv.Katakana);
Console.WriteLine(result7); //ドラエモンハ??ガ大好キ

 

なお、VBでは Imports Umayadia.Kana.KanaConverter 、C# では、using static Umayadia.Kana.KanaConverter; などを記述することで名前空間やクラス名(KanaConverter)を省略して、いきなり StrConv と記述することもできます。

 

Microsoft.VisualBasic.Strings.StrConvはひらがな・カタカナ以外に全角半角などの変換も行えますが、Kana.NETのStrConvではひらがな・カタカナ以外の変換を指示するとエラーになります。

ひらがな変換・カタカナ変換の指示は vbHiragana、vbKatakana だけでなく、VbStrConv.Hiragana, VbStrConv.Katakana または 数値の 32, 16 または、Kana.NET で独自に定義している UmaStrConv.Hiragana, UmaStrConv.Katakana を使用することもできます。

 

StrConvと同じ変換結果になるということの意味は、下記のテストにパスしているという意味です。

Kana.NET/StrConvTest.vb at main · rucio-rucio/Kana.NET (github.com)

 

改訂履歴

2021/10/31

2021/11/14