質問する質問する
 

回答済み文字列の正規化

  • 2009年2月28日 18:42ながしろ ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    ながしろです。

    International Packの範疇がいかもしれませんが、
    茶飲み話にネタ提供です。

               String boke = "ほ゛け";     // ほ゛け

                boke.Normalize();
                Console.WriteLine(boke);

    これを実行すると「ぼけ」となってほしいのですが、「ほ゛け」となります。
    解決方法をご存知の方は教えてください。

    以上、よろしくお願いします。

    永代憲明

回答

  • 2009年2月28日 23:27佐祐理 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    難しそうですね。
    The Unicode Standard 5.1 Code Charts(PDFデス)を見ると一目瞭然なのですが、
    濁点にはU+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARKとU+309B KATAKANA-HIRAGANA VOICED SOUND MARKとの2つがあります。
    Normalize()の対象は前者となっています。そして「゛」は後者で、あくまで独立して記述する際に使用する記号ということです。
    というわけで"ほ\u3099け"なら合成されて"ぼけ"になります。

    ま、Unicodeは日本人向けじゃないってことで。

すべての返信

  • 2009年2月28日 23:27佐祐理 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    難しそうですね。
    The Unicode Standard 5.1 Code Charts(PDFデス)を見ると一目瞭然なのですが、
    濁点にはU+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARKとU+309B KATAKANA-HIRAGANA VOICED SOUND MARKとの2つがあります。
    Normalize()の対象は前者となっています。そして「゛」は後者で、あくまで独立して記述する際に使用する記号ということです。
    というわけで"ほ\u3099け"なら合成されて"ぼけ"になります。

    ま、Unicodeは日本人向けじゃないってことで。
  • 2009年3月1日 2:13ながしろ ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    佐祐里さま

    ながしろです。
    ご教示、ありがとうございます。
    確認してみます。

    追記。
    確認してみました。最初のコードでは間違っていましたが、下記のコードでうまく行きました。

                hoge = "ほけ\u3099";     // ほげ
                hoge = hoge.Normalize();
                Console.WriteLine(hoge);

                boke = "ほ\u3099け";     // ほ゛け
                boke = boke.Normalize();
                Console.WriteLine(boke);

    ただ、COMBINING KATAKANA-HIRAGANA VOICED SOUND MARKはコンソールに表示できないのですね。
    このあたり、次のInternational Packのネタになりませんかね。

    永代憲明