SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

超簡単! WPFなどの.NETのアプリからUWPのAPIを使う
~日本語の読み仮名を取得するAPIを題材に

UWPアプリ開発の最前線 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

利用できないUWP APIについて

公式ドキュメントによる解説

 残念ながらすべてのUWP APIを.NET Frameworkのアプリから利用できるわけではありません。大雑把にいうと、次のようなAPIは利用できません。

【利用できないUWP API】

  • 主にUI用のAPI
  • 内部的にUWPパッケージのIDを利用しているAPI(UWPパッケージ化すれば利用可)

 1つめのグループは、厳密にいうと型定義にDualApiPartition属性が付けられていないAPIです(MicrosoftのAPIドキュメントのクラスなどのページに、付与されている属性一覧が掲載されています)。UI用コントロール類の他に、前回のIsApiContractPresentなどが含まれます。

 型定義にDualApiPartition属性が付いているAPIでも、使えないものがあります。それが2つめのグループです。UWPアプリのパッケージ(「.appx」ファイル)に付けられているパッケージIDが、APIの動作に必要な場合があります。そのようなAPIは、.NET Frameworkのアプリからは利用できません(ただし、デスクトップ ブリッジでUWPパッケージに変換すれば、従来のデスクトップアプリからも利用できます)。

実際は、かなりあやふや

 以上が公式なドキュメントに基づく説明になります。でも、APIの動作にパッケージIDが必要かどうかはドキュメントに書かれていないようですし、DualApiPartition属性が付いていないAPIでも使えることがあります(今回のふりがな用APIもそうです)。結局のところ、「試してみないと分からない」ということになりそうです。 なお、「パッケージ デスクトップ アプリで利用可能な UWP API (デスクトップ ブリッジ)」に利用できるUWP APIの一覧が載っているのですが、不完全です(例えば、本稿執筆時点では、パッケージIDを必要とするWindows.Storage.ApplicationDataがデスクトップアプリからも利用可能な方に分類されています)。

 ちなみに、利用できないAPIを呼び出そうとすると、次の画像のようになります(Visual Studio 2015)。

.NET Frameworkのアプリからまったく使えないAPI
.NET Frameworkのアプリからまったく使えないAPIは、コーディング時に警告が出る
パッケージIDが必要なAPI
利用するのにパッケージIDが必要なAPIは、実行時に例外が出る

読み仮名を取得するAPIの使い方

 今回のコードで利用しているUWPのAPIは、Windows.Data.Text名前空間のものです。サンプルコードのMainWindow.xaml.csの後半、TextBox_TextChangedメソッドから追いかけてください。

  • TextReverseConversionGenerator:読み仮名を取得するクラス
  • TextConversionGenerator:読みから漢字かな混じり文字列の候補を取得するクラス
  • TextPhoneme:音素(形態素)を表すクラス(1607/14393以降)

文字列全体の読み仮名を取得する

 TextReverseConversionGeneratorConvertBackAsyncメソッドを使います(次のコード)。これを使って例えば、リストの並べ替えを日本語の読み仮名順にすることなども簡単にできますね。

文字列全体の読み仮名を取得する
string inputText = ……省略……

// 読み仮名を取得するためのクラス
var trcg = new Windows.Data.Text.TextReverseConversionGenerator("ja");

// 文字列全体の読み仮名を取得する(Win10全バージョン)
var yomi = await trcg.ConvertBackAsync(inputText);

ふりがな用に形態素ごとの読みを取得する(1607/14393以降)

 TextReverseConversionGeneratorGetPhonemesAsyncメソッドを使います(次のコード)。形態素ごとに分割されて、TextPhonemeオブジェクトのコレクションとして結果が返ってきます。TextPhonemeには分割した元の文字列(DisplayTextプロパティ)とその読み(ReadingTextプロパティ)が入っています。元の文字列と読みが異なっている場合は漢字が含まれているのだと判断できます。

ふりがな用に形態素ごとの読みを取得する(1607/14393以降)
string inputText = ……省略……

// 読み仮名を取得するためのクラス
var trcg = new Windows.Data.Text.TextReverseConversionGenerator("ja");

// 形態素分解して読み仮名を個別に取得する(14393以降)
IReadOnlyList<Windows.Data.Text.TextPhoneme> textPhonemeList
  = await trcg.GetPhonemesAsync(inputText);

foreach (var phoneme in textPhonemeList)
{
  string text = phoneme.DisplayText; // 元の文字列を分解したもの
  string ruby = phoneme.ReadingText; // その読み
  if(text != ruby)
  {
    // rubyを振り仮名として処理する
  }
}

カナ漢字変換の候補を取得する

 TextConversionGeneratorGetCandidatesAsyncメソッドを使うと、ひらがなの文字列をカナ漢字変換したときの候補一覧が得られます(次のコード)。実際のIMEによる変換候補とは異なるようです。

カナ漢字変換の候補を取得する
string yomi = ……省略……

// 読み仮名から漢字に変換(Win10全バージョン)
var tcg = new Windows.Data.Text.TextConversionGenerator("ja");
IReadOnlyList<string> candidatesList = await tcg.GetCandidatesAsync(yomi);

形態素解析に特化したAPI

 UWPのAPIには、Windows 8.1からのJapanesePhoneticAnalyzerクラス(Windows.Globalization名前空間)というものもあります。

 JapanesePhoneticAnalyzerは、TextReverseConversionGeneratorと違って形態素解析だけに特化していて、2種類の解析モードを持っています。しかし、文字列全体の読み仮名は返してくれませんので、読み仮名を得るには形態素ごとの読みをいちいち連結する必要があります。また、入力中の半角英字を全角に変換してくれてしまうという困った仕様も持っています(TextReverseConversionGeneratorも同様でしたが、14393あたりから半角英字は半角のまま出力されるように変わりました)。

 JapanesePhoneticAnalyzerで読み仮名を得る方法は、筆者のサンプルコードをご覧ください。

次のページ
手動でセットアップする方法

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10654 2019/11/09 15:44

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング