Phoneticでカナが表示されないものがあります

タグの編集
投稿者 snowmansnow  (社会人) 投稿日時 2023/3/30 15:17:20

 こんにちは、
  Win10のExcel2016のVBAのPhonetic関数について、お聞きしたいです。
   Selection.Setphonetic を実行してから
   Phonetic(ほげ)を実行してみましたが、
   カナが表示されないものがあります。
   ascW が 16354とか16350とか-1445とか-32759のものです。

   これらは、カナが表示されないものでしょうか?
   それは、どういったものでしょうか?
   
   それとも、何かカナを表示する手段がありますか?

   VBAでもVB.NETでもC#でもいいので、何か手段があれば知りたいです。

   異体字を調べていて
   https://www.tobunken.go.jp/archives/kanji-variant-list/
   の表を調べていて、気が付きました。

   Windows7などの、IME2010だと違う結果が出るのでしょうか?
   
   わかる方がいらっしゃったら、教えて頂きたいです。
   宜しく御願いします。


投稿者 snowmansnow  (社会人) 投稿日時 2023/3/30 15:42:02
 
 こんにちは、
  続きです。
  中国語だからなのかな?と思い、VECTORの「Excelピンイン表示ツール(アドイン) 1.0」
  を使ってみたところ、
   -32759は、「gou3」と表示されて、」中国語みたいなのですが、
   他は、違うようでした。

   何故、カナが表示されないのでしょうか?

   よろしく御願いします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/30 16:36:14
> ascW が 16354とか16350とか-1445とか-32759のものです。
それぞれ、㿢(Yào)、㿞(mào)、者(zhě)、耉(gǒu) の文字ですね。

Sheet1.Range("A1").Value = ChrW(16354)
などとして確認できます。


> これらは、カナが表示されないものでしょうか?
Range.Setphonetic の結果は、実行環境によって変化する可能性があります。


> それは、どういったものでしょうか?
その文字列は、Application.GetPhonetic でカナを得られない文字列なのではありませんか?

この変換処理はおそらく、IME に問い合わせて文字列を得る仕組みになっています。
多分、 IFELanguage2 インターフェイスの GetConversionModeCaps メソッドじゃないかな…。
https://learn.microsoft.com/ja-jp/windows/win32/api/msime/nf-msime-ifelanguage-getjmorphresult

res = lang.GetJMorphResult( _
  FELANG_REQ_REV, _
  FELANG_CMODE_PINYIN Or FELANG_CMODE_NOINVISIBLECHAR, _
  Len(strText), _
  ByVal StrPtr(strText), _
  ByVal CLngPtr(0), _
  result)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/30 16:58:54
> IFELanguage2 インターフェイスの GetConversionModeCaps メソッドじゃないかな…。

IFELanguage/IFELanguage2 の GetPhonetic メソッドの方かもしれません。
https://learn.microsoft.com/en-us/previous-versions/ms970129%28v=msdn.10%29


昔は ImmGetConversionList という API もあったのですが、
Text Services Framework への移行に伴って廃止されたため、
今は COM インターフェイスでのアクセスになっている、と。
投稿者 snowmansnow  (社会人) 投稿日時 2023/3/30 21:58:17

 こんばんは、魔界の仮面弁士様
 お返事ありがとうございます。

>> ascW が 16354とか16350とか-1445とか-32759のものです。
>それぞれ、㿢(Yào)、㿞(mào)、者(zhě)、耉(gǒu) の文字ですね。
pininも記載頂き、中国語みたいですね?

>> それは、どういったものでしょうか?
>その文字列は、Application.GetPhonetic でカナを得られない文字列なのではありませんか?
はい、「?」で、それぞれ表示されます。

>この変換処理はおそらく、IME に問い合わせて文字列を得る仕組みになっています。
>多分、 IFELanguage2 インターフェイスの GetConversionModeCaps メソッドじゃないかな…。
>res = lang.tGetJMorphResult(
//https://tu3.jp/0964
のc#で動作を確認しました。①

>IFELanguage/IFELanguage2 の GetPhonetic メソッドの方かもしれません。
//https://www.pine4.net/Memo/Article/Archives/424
のc#でも動作を確認しました。②
(VB.NETで試せなくて残念でした)

GetJMorphResult、GetPhonetic、どちらも「?」表示になってしまいました。

中国語は読みが無いのは、なんとなくわかるのですが、
日本語の異体字が、中国語?なのは、不思議な感じがしたのと、
魔界の仮面弁士様が、
>それぞれ、㿢(Yào)、㿞(mào)、者(zhě)、耉(gǒu) の文字ですね。
と、中国語と指摘されてた、やり方がわかりませんでした・・・
何かコツ(?やり方)みたいなもの、ございますか?


投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/31 04:37:40
>> それぞれ、㿢(Yào)、㿞(mào)、者(zhě)、耉(gǒu) の文字ですね。
> pininも記載頂き、中国語みたいですね?

いずれも中日韓統一表意文字ではあるのですが、それらが現代の中国語圏で使われているのかまでは、
正直分からないです。pinin(拼音)も色々あるようですが、とりあえず Google 翻訳に渡してみると
各文字の発音として『㿢』なら Yào、『㿞』なら mào と表記されたので、それをそのまま貼っただけ。

Wiktionary中国語版 (https://zh.wiktionary.org/wiki/Wiktionary) で検索してみると、
㿢 → ziu6、㿞→mou6 という Jyutping(粵拼)が表記されています。

何にせよ、いずれも日本の「常用漢字」ではありませんから、現代日本語で使われることは無いでしょう。
「者」に至っては中国語ですらなく、朝鮮の한자らしいですし(一応、JIS 互換漢字として収録されており、「者」の旧字扱いではある)。

それぞれの漢字情報については、文字情報基盤 (https://moji.or.jp/mojikibansearch/basic) のサイトや、
法務省の戸籍統一文字情報 (https://houmukyoku.moj.go.jp/KOSEKIMOJIDB/M01.html)などで調べられます。


> 日本語の異体字が、中国語?なのは、不思議な感じがしたのと、
今回の文字の中で異体字登録があるのは「者」だけでしたけれどね。


>> その文字列は、Application.GetPhonetic でカナを得られない文字列なのではありませんか?
> はい、「?」で、それぞれ表示されます。
こちらの環境とはちょっと違いますね。

Unicode 非対応の環境(VBA の イミディエイト ウィンドウ、ローカル ウィンドウ、MsgBox など)で
表示したとしても、当方では「?」ではなく「?」になりました。

また、Unicode 対応の環境(Excel のセルや WSH など)で確認した場合は、
Application.GetPhonetic の結果は、
 "㿢" → "㿢"
 "㿞" → "㿞"
 "者" → "者"
 "耉" → "耉"
 "snowmansnow" → "snowmansnow"
 "魔界の仮面弁士" → "マカイノカメンベンシ"
 "⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾" → "0123"
となっていました。
なお、SetPhonetic メソッドではいずれも振り仮名が得られませんでした。



> 中国語は読みが無いのは、なんとなくわかるのですが、
たとえば中国語として
 A1 セルに「您好」
 A2 セルに「你好」
をセットして SetPhonetic メソッドを呼び出してみると、手元の環境だと、
 A1 セル → "アナタヨシ"
 A2 セル → "ニーハオ"
という振り仮名が付きました。Application.GetPhonetic メソッドでも同様に、
"アナタヨシ"、"ニーハオ" という文字列が得られました。


まぁ、こうした結果は実行環境によっても変わってきそうですけれどね。
ただ、Application.GetPhonetic メソッドは、日本語にしか対応していませんので、
そもそもの機能が、現代日本語を前提に設計されていると考えておいた方が良いでしょう。
https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.getphonetic
https://learn.microsoft.com/en-us/office/vba/api/excel.application.getphonetic
https://learn.microsoft.com/zh-tw/office/vba/api/excel.application.getphonetic
https://learn.microsoft.com/zh-cn/office/vba/api/excel.application.getphonetic

また、その変換には IME の機能が用いられているという見解を先に述べたかと思います。

手元の環境にて、メモ帳に「最中を食べている最中」という一文を入力してそれを選択状態にし、
[変換]キーを押して再変換させてみたところ、Microsoft IME がこの文字列を
「もなかをたべているさいちゅう」に対する変換として解釈してくれました。

そしてさらに、Application.GetPhonetic("最中") な変換を実行してみたところ、
最初は "モナカ" と変換されていたものが、変換辞書の学習状態によって、ある時突然、
"サイチュウ" という文字列が返されるように変化した事象を経験しました。
この点から見ても、やはりIME 依存である可能性が高いと考えられます。


今回問題となっている「㿢」や「㿞」といった文字列の場合、メモ帳から
[変換]キーによる再変換を行ってみましたが、再変換候補が出てきませんでした。
そのため、SetPhonetic や GetPhonetic でも候補が得られないという状況なのでしょう。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/31 04:38:36
『㿢』
 漢語大字典(一版):第4巻, 第2650頁, 第1字
 康熙字典:716 (26)
 MJ文字図形名: MJ002753 (バージョン 1.0)
 戸籍統一文字番号: 254760
 登記統一文字番号: 00254760
 住基ネット統一文字コード: -
 入管正字コード: -
 入管外字コード: -
 JIS漢字コード: -
 Shift_JIS: -
 Shift_JIS2004: -
 Unicode 3.0: U+3FE2 (CJK統合漢字拡張A ブロック)
 MJ縮退マップ:
  法務省戸籍法関連通達・通知:『耀』1面45区52点 (JIS第1水準)/戸籍統一文字情報 親字・正字
  法務省告示582号別表第四 その一:『耀』1面45区52点 (JIS第1水準)
  辞書類等による関連字:『耀』1面45区52点 (JIS第1水準)


『㿞』
 漢語大字典(一版):第4巻, 第2647頁, 第5字
 康熙字典:715 (2)
 MJ文字図形名: MJ002748 (バージョン 1.0)
 戸籍統一文字番号: 254260
 登記統一文字番号: 00254260
 住基ネット統一文字コード: -
 入管正字コード: -
 入管外字コード: -
 JIS漢字コード: -
 Shift_JIS: -
 Shift_JIS2004: -
 Unicode 3.0: U+3FDE (CJK統合漢字拡張A ブロック)
 MJ縮退マップ:
  法務省戸籍法関連通達・通知:『耄』1面70区46点 (JIS第2水準)/戸籍統一文字情報 親字・正字
  法務省告示582号別表第四 その一:『耄』1面70区46点 (JIS第2水準)


『者』
 MJ文字図形名: MJ030290 (バージョン 1.0)
 戸籍統一文字番号: 322260
 登記統一文字番号: 00322260
 住基ネット統一文字コード: J+FA5C
 入管正字コード: FA5B
 入管外字コード: -
 JIS X 0213: 1面90区36点 (JIS第3水準漢字)
 Shift_JIS: -
 Shift_JIS2004: 0xEDC2
 Unicode 3.2: U+FA5B (CJK互換漢字 ブロック)
 MJ縮退マップ:
  JIS包摂規準・UCS統合規則:『者』1面28区52点 (JIS第1水準)
  法務省戸籍法関連通達・通知:『者』1面28区52点 (JIS第1水準)/戸籍統一文字情報 親字・正字
 異体字実装:
  U+FA5B: 基底文字, CJK COMPATIBILITY IDEOGRAPH-FA5B
  U+8005: 親文字, CJK UNIFIED IDEOGRAPH-8005
  U+8005, U+FE00: 標準異体字, CJK COMPATIBILITY IDEOGRAPH-FA5B
  U+8005, U+FE01: 標準異体字, CJK COMPATIBILITY IDEOGRAPH-FAB2
  U+8005, U+FE02: 標準異体字, CJK COMPATIBILITY IDEOGRAPH-2F97A
  U+8005, U+E0100: Adobe-Japan1, CID+2304
  U+8005, U+E0101: Adobe-Japan1, CID+13349
  U+8005, U+E0102: Hanyo-Denshi, JA2852 / Moji_Joho, MJ020756
  U+8005, U+E0103: Hanyo-Denshi, JC9036 / Moji_Joho, MJ030290
  U+8005, U+E0104: Hanyo-Denshi, TK01074120


『耉』
 大字源: 第1409頁, 第10字
 漢語大字典(一版):第4巻, 第2781頁, 第5字
 MJ文字図形名: MJ068043 (バージョン 2.0)
 戸籍統一文字番号: -
 登記統一文字番号: -
 住基ネット統一文字コード: J+C17C
 入管正字コード: 8009
 入管外字コード: E5C1
 JIS漢字コード: -
 Shift_JIS: -
 Shift_JIS2004: -
 Unicode 1.1: U+8009 (CJK統合漢字 ブロック)
 MJ縮退マップ:
  読み・字形による類推:『耈』2面85区4点 (JIS第4水準)
投稿者 snowmansnow  (社会人) 投稿日時 2023/3/31 06:50:51

 おはようございます 
  いつも詳しいお話ありがとうございます。

   //https://www.cnblogs.com/nanfei/archive/2012/10/09/2716785.html
   に
   「MSIME.China」の
   「GetJMorphResult」の例があり、
   使ってみたかったのですが、
   何故か動きませんでした。

   他の国のIMEも、設定によっては、
   「GetJMorphResult」は、動くのでしょうか?

   動かし方とか、定数とかございましたら、お願いします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/31 10:30:55
> この点から見ても、やはりIME 依存である可能性が高いと考えられます。
GetPhonetic が IME 依存であることを裏付ける公式資料を発見。

KB870682 (2004/6/16) という古い資料ですが、Microsoft IME 2000/2002/2003 について下記のように書かれていました。

************
現象
 Excel でふりがなを使用した場合、数字に対して表示される候補の先頭は必ずしも数字にはなりません。 
詳細
 ふりがなリストを表示した場合や GetPhonetic 関数で引数に数字を指定した場合、
 指定する数字によって第一候補が数字になるものとカタカナになるものがあります。 
原因
 Excel のふりがなリストおよび GetPhonetic 関数は、IME の GetJMorphResult() インターフェースを
 使用してふりがな候補を取得しています。
 IME ではふりがな候補の並べ替え処理を行った結果を呼び出し元アプリケーションに返しますが、
 この並べ替えの処理では、元の文字が数字かどうかに関係なく、ふりがな候補となる文字列を
 単語単位に分割し、その文字数や品詞、前後につながる単語の情報など、多岐にわたる属性を評価しています。
 そのため、数字に対して表示されるふりがな候補の先頭が数字にならない場合があります。
************



> 「MSIME.China」の
> 「GetJMorphResult」の例があり、
> 使ってみたかったのですが、
> 何故か動きませんでした。
「動きませんでした」では状況が分からないです。具体的に何が起きたのかを教えてください。

COMクラスの生成ができない状態なのか、あるいは GetJMorphResult 呼び出しで
未実装HRESULT 値である E_NOTIMPL (0x80004001) が返されてくるとか、
未実装例外 NotImplementedException が飛んでくるとか、
あるいは MORRSLT 構造体の値が不審だったとか…。

念のため、実行環境の情報も添えて頂けますか。
どの言語のどのバージョンの Microsoft IME をインストールしているのか、
Office の言語設定をどの国にしているのかなど。(Office 設定は関係ないかもしれませんが、
Office IME / Microsoft IME バージョンによって振る舞いが異なる可能性があるかもしれない)

検索してみると、空文字列が返されてしまう事象の公式解説を見つけたのですが、
今踏んでみると、何故か Not Found になってしまって読めない…。
(/sitemap/index-f.xml で見る限りでは、2020年11月時点の情報っぽい?)
https://support.microsoft.com/ja-jp/topic/getjmorphresult-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E9%9A%9B%E3%81%AB-%E7%A9%BA%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E8%BF%94%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%8C%E3%81%82%E3%82%8B-fd358ab8-b859-6653-4164-95bdf902375c



> 他の国のIMEも、設定によっては、
> 「GetJMorphResult」は、動くのでしょうか?
試したことが無いのでわかりません! この分野にはそんなに詳しくないものでして。
https://learn.microsoft.com/ja-jp/windows/win32/api/msime/nf-msime-ifelanguage-getjmorphresult


> 動かし方とか、定数とかございましたら、お願いします。
IFELanguage インターフェイスで使う FELANG_ 系の定数値、
IFEDictionary インターフェイスで使う IFED_ 系の定数値や列挙値等々を知りたいなら、
まずは msime.h を読むところから始めましょう。

今だと Windows 11 SDK (10.0.22621.0) の msime.h Version 15 が最新だと思います。
https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/


そこには HKEY_CLASSES_ROOT の値として 4 つの #define と…
#define szImeJapan          TEXT("MSIME.Japan")
#define szImeKorea          TEXT("MSIME.Korea")
#define szImeChina          TEXT("MSIME.China")
#define szImeTaiwan         TEXT("MSIME.Taiwan")

下記の Class ID が公開されていますね。
{6A91029E-AA49-471B-AEE7-7D332785660D} CLSID_VERSION_DEPENDENT_MSIME_JAPANESE



ただし msime.h の内容はバージョンによって情報量が結構増減するので、
可能であれば新旧バージョンを読み比べた方が良いかもしれません。
(ネットにあったサンプルが、今ではサポートを終了しているバージョン向けのもので
 あったという可能性があるかもしれない)

とりあえず、ここに msime.h Version 1.4 がありました。 https://searchcode.com/total-file/10960454/
このころは JPOS_ 系定数などに日本語のコメントが埋め込まれていますし、
今はサポートを終了した古い IME も並んでいますね。
#define szImeJapan98        TEXT("MSIME.Japan.6")
#define szImeJapan8         TEXT("MSIME.Japan.8")     // For MS-IME 8.0
#define szImeJapan9         TEXT("MSIME.Japan.9")     // For MS-IME 8.1
#define szImeJapan10        TEXT("MSIME.Japan.10")    // For MS-IME 9
#define szImeJapan12        TEXT("MSIME.Japan.12")    // For Office12 IME
#define szImeJapan11        TEXT("MSIME.Japan.11")    // For LH IME
#define szImeJapan          TEXT("MSIME.Japan")


{F1F62C04-3D26-4A08-A9E9-04B95B63F907}  CLSID_VERSION_DEPENDENT_MSIME_JAPANESE (Office IME)
{6A91029E-AA49-471B-AEE7-7D332785660D}  CLSID_MSIME_JAPANESE_11
{6A91029E-AA49-471B-AFE7-7D332785660D}  CLSID_VERSION_DEPENDENT_MSIME_JAPANESE (LH IME)
{A64BDBED-14B2-4F56-9C10-3DEBBC13FE7B}  CLSID_MSIME_JAPANESE_10 (IME 9)
{AF9EE286-8CD3-445E-8842-433E5C460775}  CLSID_MSIME_JAPANESE_9 (MSIME.9; Satori 8.1)
{462C11AD-BBBE-43E3-9976-FA8E6B0DFF01}  CLSID_MSIME_JAPANESE_8 (MSIME.8; Satori 8.0)
{019F7150-E6DB-11D0-83C3-00C04FDDB82E}  CLSID_MSIME_JAPANESE_6 (MSIME.6)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/31 11:02:39
> 中国語として
>  A1 セルに「您好」
>  A2 セルに「你好」
> をセットして SetPhonetic メソッドを呼び出してみると、手元の環境だと、
>  A1 セル → "アナタヨシ"
>  A2 セル → "ニーハオ"
> という振り仮名が付きました。

"你好" だと 「ニーハオ」 に変換されましたが、間に空白を入れて
"你 好" にすると 「ナンジ//ヨシ」 に変わりました。

"안녕하세요" だと、SetPhonetic してもフリガナが付きませんでした。
ハングルは駄目っぽい。

"我爱你"だと「ワレ//ナンジ」
"我愛你"だと「ワレ/アイ/ナンジ」

你 は EUC-JP や JIS X 0212 に含まれるけれど
爱 は含まれないからですかね…。

"麻雀" だと「マージャン」

"再见" だと「サイ」で
"再見" だと「サイ/ケン」
これも 见 が日本語の文字集合に無いためかな。
投稿者 snowmansnow  (社会人) 投稿日時 2023/3/31 11:23:36

 こんにちは、魔界の仮面弁士様
 早朝も御返事ありがとうございました。

>>> この点から見ても、やはりIME 依存である可能性が高いと考えられます。
>>GetPhonetic が IME 依存であることを裏付ける公式資料を発見。
> Excel のふりがなリストおよび GetPhonetic 関数は、IME の GetJMorphResult() インターフェースを
GetJMorphResult()を、教えて頂いていて良かったです!

>> 「MSIME.China」の
>> 「GetJMorphResult」の例があり、
>> 使ってみたかったのですが、
>> 何故か動きませんでした。
>「動きませんでした」では状況が分からないです。具体的に何が起きたのかを教えてください。
申し訳ありません。出先なので、
テキストボックス2つとボタン1つをフォームに貼り付け、
テキストボックス1に中国語を入れて、ボタンを押すと
テキストボックス2にpinyinが表示されると思ったのですが、
エラーも何もなく、何も起きませんでした・・・・
夜には、詳しい報告ができると思います。
win10pro visualstudio2019でC#のフォームアプリケーション(フレームワーク)で試してみました。
インストール言語は
日本語
中国語(簡体字、中国)
英語(米国)
ドイツ語(ドイツ)
韓国語
です



>そこには HKEY_CLASSES_ROOT の値として 4 つの #define と…#
//https://mihai-nita.net/2005/12/13/reverse-ime-getting-hiraganakatakanapinyinbopomofo-from-kanji/
のアプリ?(C++?)と一致してるように見えました

MSIME.Chinaにして、
GetJMorphResultの第2引数に
>Private Const FELANG_CMODE_PINYIN = &H100
//https://foolexp.wordpress.com/2012/07/14/p2wpsu-4l/
を0(デフォルト)
>Private Const FELANG_CMODE_HIRAGANAOUT = &H0
の代わりに与えると、pinyin表示になるのかな?と思っています。

>"你好" だと 「ニーハオ」 に変換されましたが、間に空白を入れて
日本語IMEなのに、面白いですね!






投稿者 snowmansnow  (社会人) 投稿日時 2023/4/1 07:25:45

 おはようございます。 
  昨晩は体調不良で遅くなってしまいました。ごめんなさい。
>> 「MSIME.China」の
>> 「GetJMorphResult」の例があり、
>> 使ってみたかったのですが、
>> 何故か動きませんでした。
>「動きませんでした」では状況が分からないです。具体的に何が起きたのかを教えてください。

 これは、動きました。
 private void button1_Click_1(object sender, EventArgs e)
 のところが、ボタンの(name)と不一致で、押しても連動してませんでした。
 お騒がせして申し訳ございません。

 でも
>㿢㿞耉
と入力すると
ハンドルされていない例外
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
他のメモリが壊れていることが考えられます
となってしまいました

魔界の仮面弁士様の
㿢(Yào)、㿞(mào)、耉(gǒu) 
を出したいだけだったのに・・・

とりとめなくなってきましたので、一旦解決で、
また勉強して、わからなくなりましたら、御質問致します
ありがとうございます。