fc2ブログ

記事一覧

漢字のふりがなを取得する方法 -Yahoo REST API v1- | Xamarin.Forms


今回は Xamarin.Forms で漢字交じりの文字列からふりがなを取得する方法についてご紹介いたします。Android と iOS で共通して使用ができます。
尚、ふりがなの取得には Yahoo API を今回採用しました。

※2022/02/09追記
当記事は Yahoo API V1 の内容です。新しい V2 に対応したソースコードを新しい記事で記載しています。V2の内容は「漢字のふりがなを取得する方法 -Yahoo REST API v2-」をご参考ください。


【Yahoo API を採用した経緯について】
Windows では Windows.Globalization.JapanesePhoneticAnalyzer で取得可能ですが、当然プラットフォームが異なるので使用できません。

Androidではkuromoji/jakaroma/Kakasi などのJavaソースが公開されており、BindingLibrary を作成して jar ファイルを Xamarin 上で動作することができますが、jar ファイルの容量が11MBを超えている為、アプリにそのサイズは厳しいという事で、断念しました。

iOS では CoreFoundation に相当のクラスが用意されているようですが、Xamarinのクラスライブラリ内に見つかりません。

それに比べて API であれば REST で呼び出して使用するだけなので、プログラムを100%PCLのみで共通化でき、軽量・メンテナンスフリーであることがメリットだと思います。(それにヤフー程の規模の企業は簡単には潰れないでしょう。。。)





前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.795 (NuGet Xamarin.Forms 2.3.4.247)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.6.0.10



1.Yahooの登録

(1)以下の URL で YahooID と紐づけを行います。(YahooID が無い方はYahooJapan のサイトで作成してください。)
https://developer.yahoo.co.jp/

xamarin_yahoo_api_furigana_01.png


(2)アプリを登録します。クライアントサイドで作成します。
https://e.developer.yahoo.co.jp/register

xamarin_yahoo_api_furigana_02.png


(3)ルビ振り API の概要を確認します。
https://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html
基本的には URL に GET を投げてリターンの XML を取得するだけです。

URLパラメータは3種類。
appid:アプリケーションID。「アプリケーションの管理」→アプリケーション情報にあるClientIDです。
sentence:ふりがなに変換したい文字列(必ずURLエンコードして渡してください)
grade:指定しないほうが良いです。grade=8に設定するとふりがなが取得できません。

尚、念のため制限事項があるようですのでお伝えしておきます。
・アプリケーションID毎に50000件のリクエストが上限となっています。
・1リクエストの最大サイズを100KBに制限されています。

私の印象としては、かなり良心的な設定で特に気にしないで良いかなって感じです。
1リクエストの最大サイズは全て2バイト文字だとして、100KB×1000B÷2B=50000字までです。小説でない限りは超えそうにないですし、アプリケーションID毎の上限もアプリの利用者数に応じて YahooID を増やしてしまえばどうとでもなりそうかなって思っています。



2.結果をXMLで確認

取得したアプリケーションID(ClientID)と変換したい文字列をURLに組み込んでみます。
https://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=アプリケーションID&sentence=%E5%B1%B1%E7%94%B0%E8%8A%B1%E5%AD%90
このような URL をブラウザに貼り付けると、返ってきたデータは以下のような XML 形式となっていました。

<ResultSet xmlns="urn:yahoo:jp:jlp:FuriganaService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:jlp:FuriganaService https://jlp.yahooapis.jp/FuriganaService/V1/furigana.xsd">
<Result>
<WordList>
<Word>
<Surface>山田</Surface>
<Furigana>やまだ</Furigana>
<Roman>yamada</Roman>
</Word>
<Word>
<Surface>太郎</Surface>
<Furigana>たろう</Furigana>
<Roman>tarou</Roman>
</Word>
</WordList>
</Result>
</ResultSet>

結果を確認するとローマ字にも変換が可能ですね。



3.PCLの実装方法

以下のファイルを PCL に実装します。
HttpWebRequest で変換の URL を送信し、XML を受信します。
次に XML の Furigana フィールドに入っているデータを連結してふりがなを完成させます。

YahooAPI.cs
using System.Threading.Tasks;
using System.Xml;
using System.IO;
using System.Net;
public static class YahooAPI
{
    private const string FuriganaUrl = "https://jlp.yahooapis.jp/FuriganaService/V1/furigana";
       
    public static async Task<string> GetPhonetic(string accountId, string kanji)
    {
        string result = String.Empty;
        try
        {
            //HttpWebRequestを用いた接続例
            var request = HttpWebRequest.Create(FuriganaUrl + "?appid=" + accountId + "&sentence=" + System.Net.WebUtility.UrlEncode(kanji)) as HttpWebRequest;
            request.Method = "GET";
            request.Accept = "*/*";
            using (HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse)
            {
                Stream stream = response.GetResponseStream();
                using (StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8))
                {
                    result = reader.ReadToEnd();
                }
            }

            //取得したXMLファイルからふりがなのフィールドを抜き出して連結する
            string furigana = await Task.Run(() =>
            {
                //XMLをLinqで取得する方法
                //var doc = XDocument.Parse(result);
                //IEnumerable<string> furiganaList = from w in doc.Descendants("Word")
                //                                   select w.Attribute("Furigana").Value;
                //XMLから取得できたふりがなリストの文字列を連結する
                //return String.Join("", furiganaList);

                //Linqでうまく取得できないため
                //XmlReaderでループして読み取る
                string ret = String.Empty;
                using (XmlReader reader = XmlReader.Create(new StringReader(result)))
                {
                    while (reader.Read())
                    {
                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element:
                                if (reader.Name == "Furigana" &&
                                    reader.Read() && //進む
                                    reader.HasValue)
                                {
                                    ret += reader.Value;
                                }
                                break;
                        }
                    }
                }
                return ret;
            });
               
            return furigana;
        }
        catch (System.Net.Http.HttpRequestException hre)
        {
            System.Diagnostics.Debug.WriteLine(hre.Message + System.Environment.NewLine + hre.StackTrace);
            return String.Empty;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
            return String.Empty;
        }
    }
}

XML のデータは Linq で絞り込み&取得できるはずなんですが、私の知識不足の為、Xamarin で動作させると正しく取得ができませんでした。よって XmlReader で取得しています。ご了承くださいませ。



4.使用方法

フリガナを取得したいEntryオブジェクトの Completed イベントまたは Unfocused イベントでYahooにリクエストします。

RegisterCustomerPage.xaml.cs
this.txtFirstName.Completed += (async (s, e) =>
{
    this.txtFirstNameKana.Text = await YahooAPI.GetPhonetic("YahooAppId", this.txtFirstName.Text);
});
this.txtLastName.Completed += (async (s, e) =>
{
    this.txtLastNameKana.Text = await YahooAPI.GetPhonetic("YahooAppId", this.txtLastName.Text);
});

ちなみに、今回は全角ひらがなに変換していますが、カタカナに変換したい場合は以下の力技ライブラリを用いると良いでしょう。
http://wiki.dobon.net/index.php?free%2FkanaxsCSharp




最後までお読みいただきありがとうございます。
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
https://itblog.dynaspo.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。