C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

サロゲートペアのDB40

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■95539 / inTopicNo.1)  サロゲートペアのDB40
  
□投稿者/ S.Kos (17回)-(2020/08/15(Sat) 08:44:03)

分類:[.NET 全般] 

みなさま、こんにちは

VBAでIPAmj明朝フォントを扱う・・苦闘(笑)が続いています。

サロゲートペアを含む文字列にLen()は対応できないため、固有の手立てが必須と判り、アレコレを試しました。
上位サロゲート D800〜DBFF を一文字とすれば良いのでは、と辿り着いたところです。

様々な試行錯誤の中で、この範囲に含まれる DB40 に、なんらか特別な意味があるように思うのですが、如何でしょう?


引用返信 編集キー/
■95540 / inTopicNo.2)  Re[1]: サロゲートペアのDB40
□投稿者/ Hongliang (1077回)-(2020/08/15(Sat) 10:01:11)
> サロゲートペアを含む文字列にLen()は対応できないため、固有の手立てが必須と判り、アレコレを試しました。
> 上位サロゲート D800〜DBFF を一文字とすれば良いのでは、と辿り着いたところです。

.NET Frameworkの標準ライブラリ内では、StringInfoクラスを使うのが一番手軽でしょう。
ただし、現在のUnicodeには書記素クラスタという概念があり、合字によって、何十ってレベルで並んだコードポイントをまとめて1文字とすることもできたりします。サロゲートペアや単純な結合文字ぐらいはともかく、この辺はStringInfoでも扱えません(まあUnicodeのバージョンアップでしょっちゅう合字が追加されているので、フレームワークとして追いきれるものでもないです)。
ご使用のプログラムの中で1文字として認識する範囲を決めておかないといけないでしょう。

> 様々な試行錯誤の中で、この範囲に含まれる DB40 に、なんらか特別な意味があるように思うのですが、如何でしょう?

UTF-16としては特に意味はないと思いますが、なぜそう思われたのでしょうか?
Unicodeとしては、そのサロゲートペアに対応するU+E01xxはIVSの領域ですが。
ちなみにUnicodeのコードポイントとUTF-16の符号は、比較的単純に変換されます。
https://ja.wikipedia.org/wiki/UTF-16
引用返信 編集キー/
■95541 / inTopicNo.3)  Re[1]: サロゲートペアのDB40
□投稿者/ くまくま (36回)-(2020/08/15(Sat) 10:07:12)
S.Kosさん
サロゲートペアは
上位代用符号位置 (D800-DBFF)
下位代用符号位置 (DC00-DFFF)
の範囲で、漢字専用となると
サロゲートペア
上位代用符号位置 (DB40)
下位代用符号位置 (DD00-DDEF)
だそうです。

※回答ではありません
フォントで大分苦戦されているようですね
以前VBAでフォント情報を取得する為に作ったアドインがあるんですが
いります?
取得できる情報
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.glyphtypeface?view=netframework-4.8
あとUTF-8での一覧もExcelで用意しています。

引用返信 編集キー/
■95543 / inTopicNo.4)  Re[1]: サロゲートペアのDB40
□投稿者/ 魔界の仮面弁士 (2812回)-(2020/08/15(Sat) 11:54:47)
2020/08/15(Sat) 12:00:47 編集(投稿者)

No95539 (S.Kos さん) に返信
> サロゲートペアを含む文字列にLen()は対応できないため、固有の手立てが必須と判り、アレコレを試しました。

.NET の世界だと、System.Globalization.StringInfo クラスとか、
.NET Core の System.Text.Rune 構造体なんかがありますが、
VBA だとそういったものが無いので、自前で判定するしかないでしょう。

ところで、Len しようとしている目的は何でしょうか。
固定幅フォントでの文字幅算出のため? 文字数のカウント? それとも…?

たとえば文字数をカウントするといっても、何をもって「1 文字」と見るかは処理系によります。

サロゲートペアの問題もありますが、異体字セレクタが含まれるなら、
サロゲートペアかどうかだけの判定では、文字数カウントにはなりえません。

No95405 で例示したような書記素クラスターへの考慮が必要になることがあります。
https://hydrocul.github.io/wiki/blog/2015/1025-unicode-grapheme-clusters.html


令和の「令」の異体字 1 文字を Excel VBA で表すために、
下記のような異なるバイナリ表現がありえます。(※フォント側の対応も必要)

Option Explicit
Sub Example1()
  MsgBox Chr(&H97DF), vbInformation
  [A1] = ChrW(&HF9A8) 'U+F9A8 (CJK 互換漢字 FA98)
  [A2] = ChrW(&H4EE4) 'U+4EE4 (CJK 統合漢字 FEE4)
  [A3] = ChrW(&H4EE4) & ChrW(&HFE00) 'U+4EE4,U+FE00 (CJK 互換漢字 FA98)
  [A4] = ChrW(&H4EE4) & ChrW(&HDB40) & ChrW(&HDD00) 'U+4EE4,U+EF0100 (Adobe-Japan1 の CID+4009)
  [A5] = ChrW(&H4EE4) & ChrW(&HDB40) & ChrW(&HDD01) 'U+4EE4,U+EF0101 (Hanyo-Denshi の JA4665 / Moji_Joho の MJ006533)
  [A6] = ChrW(&H4EE4) & ChrW(&HDB40) & ChrW(&HDD02) 'U+4EE4,U+EF0102 (Hanyo-Denshi の KS004910)
  [A7] = ChrW(&H4EE4) & ChrW(&HDB40) & ChrW(&HDD03) 'U+4EE4,U+EF0103 (Hanyo-Denshi の MJ056905)
End Sub

この辺は、どの文字集合(≠文字コード)を扱いたいのかにもよっても変わってくるので、
何のために異体字を必要としているのか、とか、
何を目的として Len の代替機能を探しているのか、など
具体的な背景を示した方が良いかと思います。


そもそも、S.Kos さんが必要としている文字コレクションは何でしょうか。

Adobe-Japan1 コレクションなのか、
Hanyo-Denshi コレクションなのか、
Moji_Joho コレクションなのか…。
https://unicode.org/ivd/data/2017-12-12/


この辺をハッキリさせておかないと、データクレンジングの際に苦労するかも。


Moji_Joho を前提とするのであれば、もちろん IPAmj明朝 を使えば良いとは思うのですが、
No95507 のスレッドで現れた U+5EE3,U+E0107 などは、Moji_Joho に含まれていないわけですから、
そもそもフォントの選定段階でミスっているんじゃないかな…と心配しています。

もしも U+5EE3,U+E0107 を使いたいなら、Hanyo-Denshi 対応のフォントが必要になるでしょう。
(この文字は登記固有文字です)

フォントによって、各コレクションへの準拠度合いは異なりますし、
そもそも、各コレクションごとに扱える文字は異なっており、
各コレクション間の互換性もありません。

たとえば、Shift_JIS における Chr(&HFAAA) の「ェ」の文字。
Unicode だと ChrW(&H5BEC)「ェ」ですね。

これ、Adobe-Japan1 コレクションだと、
 CID+8436 (U+5BDB,U+E0101)
 CID+20302 (U+5BEC,U+E0100)
で重複登録されていますが、Hanyo-Denshi コレクションだと
 JC4758 (U+5BEC,U+E0101)
のみです。

U+5BDB 系は「寛」に対する異体字、
U+5BEC 系は「ェ」に対する異体字ですね。

Excel などでデータ化するにしても、きちんと正規化しておかないと、
後で検索する際などに問題になってくるかもしれません。

https://wontfix.blogspot.com/2011/05/ivsunicode.html
http://masablog.livedoor.biz/archives/52190021.html
引用返信 編集キー/
■95544 / inTopicNo.5)  Re[2]: サロゲートペアのDB40
□投稿者/ S.Kos (18回)-(2020/08/15(Sat) 12:04:33)
みなさまのご教示(と同情・笑)、まことにありがとうございます。

あちこちのサイトに倣い、魚へんに花の「ほっけ」を材料に、上位サロゲート D800〜DBFF を一文字と数えてみました。
すると、花の下部によって、結果が異なりました。

 「イと七」の「ほっけ」U+29E3D,29E3D_E0102は確かに「1文字」と数えますが、
 「イとヒ」の「ほっけ」U+29E3D,29E3D_E0104はなんと「2文字」になってしまいます。

なんじゃこりゃあ・・?、と、左端に異字体を並べて下記コードを走らせました。

For yPos = 1 To 6
bytBuf = Trim(Cells(yPos, 1).Value)
LB = LBound(bytBuf)
UB = UBound(bytBuf)

j = 4: surLng = 0
For i = LB To UB Step 2
surBuf = bytBuf(i) + bytBuf(i + 1) * (2 ^ 8)
If (&HD800& <= surBuf And surBuf <= &HDBFF&) Then
surLng = surLng + 1

Cells(yPos, j).Value = Hex(surBuf)
j = j + 1

End If
Next
Cells(yPos, 3).Value = surLng
Next

すると、上記「ほっけ」U+29E3D,29E3D_E0104の他、「テ今」U+2B746,2B746_E0101などでも、DB40を「二文字目」として数えているように思います。

引用返信 編集キー/
■95545 / inTopicNo.6)  Re[3]: サロゲートペアのDB40
□投稿者/ 魔界の仮面弁士 (2813回)-(2020/08/15(Sat) 12:52:42)
2020/08/15(Sat) 15:01:12 編集(投稿者)

No95544 (S.Kos さん) に返信
> DB40を「二文字目」として数えているように思います。

異体字セレクタの話と、サロゲートペアの話がごっちゃになっているのだと思います。
書記素クラスターについて調べてみてください。


そもそも、何をもって「一文字」と見なすのかは、それぞれのシステム要件によって変化します。

タブ文字や改行、ゼロ幅スペースやLTR/RTL、結合文字や異体字セレクタ、
サロゲートペア、BOM の有無などがある場合、文字数をどのように数えるべきか、
あらかじめ考慮しておくことが望ましいでしょう。


>  「イと七」の「ほっけ」U+29E3D,29E3D_E0102は確かに「1文字」と数えますが、
>  「イとヒ」の「ほっけ」U+29E3D,29E3D_E0104はなんと「2文字」になってしまいます。

U+0000 〜 U+FFFF の範囲の文字は、16 bit で表されるので、1 つの ChrW で表現できます。
U+10000 〜 U+1FFFFF の範囲の文字は 16 bit に収まらず、2 つの ChrW で表現されます。これがサロゲートペア。


ホッケの場合、Unicode のコードポイントは U+29E3D です。

U+29E3D というのは、Unicode の第 0 面すなわち BMP(基本多言語面) に収まらないので、
サロゲートペアをもって表現されます。すなわち、
 UTF-8 で表すと 4 バイト: F0,A9,B8,BD
 UTF-16LE で表すと 4 バイト: 67,D8, 3D,DE
 UTF-16BE で表すと 4 バイト: D8,67, DE,3D
です。

変換ルールについては下記をご覧ください。
(サロゲートペアが必要なのは UTF-16 だけであり、UTF-8 や UTF-32 では使用されません)
http://nomenclator.la.coocan.jp/unicode/ucs_utf.htm


つまり、VBA の String なら『ChrW(&HD867) & ChrW(&HDE3D)』、
あるいは『ChrB(&H67) & ChrB(&HD8) & ChrB(&H3D) & ChrB(&HDE)』で表されます。

このため、67,D8,3D,DE は、「本来は 1 文字」ではあるものの、
VBA の Len では 2 を返し、LenB では 4 を返す状態となります。

※VBA の文字列は、元々 UCS-2 をベースとしており、
 32bit(2 バイト)で 1 文字となる前提で設計されています。


ここで、 No95541 でくまくまさんが提示してくださった
> 上位代用符号位置 (D800-DBFF)
> 下位代用符号位置 (DC00-DFFF)
と比較してみましょう。

D867 が上位代用符号で、
DE3D が下位代用符号であることがわかりますね?

なので、上記から「実は U+10000 〜 U+1FFFFF の範囲の 1 文字である」と判断することができます。


さて、問題は異体字。

ホッケに対する異体字としては、
 U+29E3D, U+E0100 … AJ1[CID+20315]
 U+29E3D, U+E0101 … AJ1[CID+15437]
 U+29E3D, U+E0102 … 文字情報[MJ055217], 汎用電子[JD9344]
 U+29E3D, U+E0103 … 文字情報[MJ055216], 汎用電子[KS523690],
 U+29E3D, U+E0104 … 文字情報[MJ055218]
の 5 種類のシーケンスが存在します。
前半部の U+29E3D の扱いは、上記で説明したので省略。

でもって異体字セレクタ (VARIATION SELECTOR) は、
SVS で利用されるものが U+FE00 〜 U+FE0F (VS1〜VS16) で、
IVS で利用されるものが U+E0100 〜 U+E01EF (VS17〜VS256) です。
あとは、U+180B 〜 U+180D の MONGOLIAN FREE VARIATION SELECTOR (FS1〜FS3) ってのもあります。


SVS は BMP(基本多言語面) の 16bit 範囲に収まりますが、
IVS は BMP(基本多言語面) の 16bit 範囲に収まらないため、
ここでもまた、再度サロゲートペアをもって表現されます。


[MJ055217] の _E0102 部分なら、
 UTF-8 で表すと 4 バイト: F3,A0,84,82
 UTF-16LE で表すと 4 バイト: 40,DB, 02,DD
 UTF-16BE で表すと 4 バイト: DB,40, DD,02
です。

[MJ055218] の _E0104 部分なら、
 UTF-8 で表すと 4 バイト: F3,A0,84,84
 UTF-16LE で表すと 4 バイト: 40,DB, 82,DD
 UTF-16BE で表すと 4 バイト: DB,40, DD,04
です。


IVS を UTF-16 で表現した場合、
1 文字目が U+DB40 になっていますよね?


それが今回質問いただいた【DB40】が出現する理由です。

U+E0102 が、何故 U+DB40,U+DD02 に変化するのかは、先程の
http://nomenclator.la.coocan.jp/unicode/ucs_utf.htm
のルールに照らし合わせることで算出できますが、
くまくまさんが提示されている通り、IVS が
> 上位代用符号位置 (DB40)
> 下位代用符号位置 (DD00-DDEF)
の範囲をとるのだと言い換えることもできます。


ホッケの異体字の場合、ベース文字がサロゲートペアで、
異体字セレクタもサロゲートペアという組み合わせになりますので、
VBA 上から見た場合、U+29E3D_E0102 も U+29E3D_E0104 も、
LenB では 8、Len では 4 という値を返すことになります。


不要であれば、異体字セレクタを 0 文字としてカウントするという手も
ありますが、この手の問題は結合文字でも起こりえることに留意しましょう。
引用返信 編集キー/
■95546 / inTopicNo.7)  Re[4]: サロゲートペアのDB40
□投稿者/ 魔界の仮面弁士 (2814回)-(2020/08/15(Sat) 14:01:25)
2020/08/15(Sat) 14:44:28 編集(投稿者)

No95545 (魔界の仮面弁士) に追記
> 何をもって「一文字」と見なすのかは、それぞれのシステム要件によって変化します。
> この手の問題は結合文字でも起こりえることに留意しましょう。

何のために異体字を使用する必要が生じているのか、その背景が
分からないので、どこまでの文字種に対応させるべきかは不明ですが…。

サロゲートペア以外で、日本語の文字数カウントに影響がありそうなのが、
いわゆる結合文字とよばれる文字種です。

たとえば、JIS X 0213 における 1面5区87点〜94点の範囲にある
半濁点付きカタカナ。

これらは JIS X 0213 内で、それぞれ 1 文字として定義されていますが、
Unicode で符号化する場合は、結合文字を伴った 2 要素で表現されます。

Range("A1").Value = ChrW(&H30BB) & ChrW(&H309A)


結合文字同様、字形指示列も 1 文字を複数要素で構成しますが、
IVS は、字形指示列かつサロゲートペアに相当する符号位置にあるため
UTF-16 で表現する場合、さらに要素数が増えて見えてしまうことになります。

しかも、結合文字は複数使われる可能性があるという点にも注意。


もう一つ例を挙げると、 No95405 で例示した事例にあった

 '「本来は 1 文字」と扱われるべきもの
 Range("A1").Value = ChrW(&HD83D) & ChrW(&HDC69) & ChrW(&HD83C) & ChrW(&HDFFB) & ChrW(&H200D) & ChrW(&HD83D) & ChrW(&HDC66) & ChrW(&HD83C) & ChrW(&HDFFC)

などもややこしいところ。

この場合、捉え方によっては 1 文字ともいえるし、
3 文字ともいえるし、5 文字ともいえるし、9 文字ともいえます。


上記の VBA によって出力される内容を
https://747.github.io/vsselector/
の左上のボックスに貼ってみると、テキストボックス上は
一つの絵文字として見えますが、Unicode 上では
 青:U+1F469
 緑:U+1F3FB
 緑:U+200D
 青:U+1F466
 緑:U+1F3FC
の 5 要素で表現されているのだ、ということが分かります。


この時、コードポイントの背景が青く表示されるのがベースの字形で、
背景が緑になっているのが、合成文字や字形指示列です。

さらに、その緑の U+200D を × ボタンで削除して
 U+1F469
 U+1F3FB
 U+1F466
 U+1F3FC
の 4 要素に減らすと、結合が解除されて 2 文字に増えることが分かります。
※ U+200D は、ゼロ幅接合子と呼ばれる文字です。
引用返信 編集キー/
■95547 / inTopicNo.8)  Re[2]: サロゲートペアのDB40
□投稿者/ S.Kos (19回)-(2020/08/16(Sun) 09:35:46)
みなさま、ご教示のほど感謝です。
丁寧な解説の全てをなんとか「読了」しましたが、とても「理解」には至っていません。

魔界の仮面弁士さんご指摘の
>何のために異体字を使用する必要が生じているのか、その背景が
>分からないので、どこまでの文字種に対応させるべきかは不明ですが…。
>
に応じつつ、いま一度、直面する課題を整理します。

・背景
Shift-JISと外字で構成する人名を扱うシステムがあります。
入出力フロントエンドをEXCELで構成し、SQLSERVERに置いたデータとは、ODBCを経由して遣り取りします。
本(2020)年三月、MSのお達し(苦笑)があった、と知りました。
           ↓
https://blogs.windows.com/japan/2020/02/20/about-windows-and-japanese-text/

そう遠くない将来、必須となるかも知れないUnicode体系への移行に備え、様々を手探りしているところです。

・対応
手探りの中で"IPAmj明朝フォント"を知り、これを使用することとしました。
SQLSERVERのフィールド変更も、VBAによる読み書きも、問題いことを確認しています。

・課題
このシステムでは人名の「姓」と「名」を別個に入力させています。
で、その文字列長の合計 Len(姓)+Len(名) が五文字以下なら、間にスペースを挟んで「姓名を五文字」に揃えます。
一覧表に書き出した時の見栄えだけなんですけどね!
 大山宗太郎
 乾薫
と並ぶより、
 大山宗太郎
 乾   薫
としたい・・・

・課題の絞り込み
という訳で、"IPAmj明朝フォント"を用いた姓と名に顕れる「異字体」のみ、を処理できれば十分です。
95544に準えれば、
 LenExp(「イと七」の「ほっけ」U+29E3D,29E3D_E0102) = 1
 LenExp(「イとヒ」の「ほっけ」U+29E3D,29E3D_E0104) = 1
 LenExp(「テ今」U+2B746,2B746_E0101) = 1
となるような LenExp() を探しています。

・読了から理解へ向けて
魔界の仮面弁士さんご指摘の
>くまくまさんが提示されている通り、IVS が
>> 上位代用符号位置 (DB40)
>> 下位代用符号位置 (DD00-DDEF)
>の範囲をとるのだと言い換えることもできます。
>・・
>不要であれば、異体字セレクタを 0 文字としてカウントするという手も
>ありますが、この手の問題は結合文字でも起こりえることに留意しましょう。
>
上に記すように「姓と名の異字体」だけが対象ゆえ、これでいけるかと思います。
二度目以降のDB40を数えない、としたテストコードは、いまのところ問題を生じていません。

けれども最大のモンダイ(泣き笑)は、魔界の仮面弁士さんご指摘の
>異体字セレクタの話と、サロゲートペアの話がごっちゃになっているのだと思います。
>
であると、自覚しました。

引用返信 編集キー/
■95548 / inTopicNo.9)  Re[3]: サロゲートペアのDB40
□投稿者/ くまくま (37回)-(2020/08/16(Sun) 11:47:55)
No95547 (S.Kos さん) に返信
> ・背景
> Shift-JISと外字で構成する人名を扱うシステムがあります。
> 入出力フロントエンドをEXCELで構成し、SQLSERVERに置いたデータとは、ODBCを経由して遣り取りします。
背景はわかったのですが、
それなら"IPAmj明朝フォント"がUnicodeかUTF-16またはUTF-8で
第1水準漢字〜第4水準漢字、人名用漢字のどこまで対応されているかは調査が済んでいるのですか?
「簡体字」が混じっていたりしませんか?
この辺りは魔界の仮面弁士さんの指摘通りVBAではできないので
VB.net等ソフトで調べるかフォントの文字一覧を別に入手する必要があります。

EXCELの場合優秀で"IPAmj明朝フォント"にない漢字を作り出したりします。
(このことは魔界の仮面弁士さんが丁寧に解説されています)
しかしTextやhtml、PDFに変換した際や印刷時"IPAmj明朝フォント"に登録が無いと表示できない
または思った漢字にならない可能性があります。

その点は考慮されていますか?
引用返信 編集キー/
■95549 / inTopicNo.10)  Re[4]: サロゲートペアのDB40
□投稿者/ くまくま (38回)-(2020/08/16(Sun) 11:59:29)
追記
漢字を網羅という意味では
「T書体フォント」
http://charcenter.tron.org/tfont/download_gtset.html
というのがあります。

これは東京大学大学院情報学環坂村研究室で
「今までに存在した漢字(日本、中国等)すべてを網羅する」をコンセプトに作成された
世界最大の漢字文字セットです。

参考までに...
引用返信 編集キー/
■95552 / inTopicNo.11)  Re[5]: サロゲートペアのDB40
□投稿者/ S.Kos (20回)-(2020/08/16(Sun) 20:14:56)
くまくまさん、重ねてのご教示、ありがとうございます。

今朝ほどの95547には明記しませんでしたが、95541に記された、
>の範囲で、漢字専用となると
>サロゲートペア
>上位代用符号位置 (DB40)
>
は、大きなヒントでした。
手探りの最中、95545で魔界の仮面弁士さんが、背中を押してくださいました。

引用返信 編集キー/
■95553 / inTopicNo.12)  Re[6]: サロゲートペアのDB40
□投稿者/ S.Kos (21回)-(2020/08/16(Sun) 20:22:59)
くまくまさんへの御礼を含み、もう20行ばかりあるのですが、これを貼り付けると「迷惑投稿者」となってしまいます。
なぜでしょう・・?

ひとつ上95552は別ファイルからの貼り付け、来れはンラインで記しています。

特定の文字あるいは記号がチェックされてる?


引用返信 編集キー/
■95555 / inTopicNo.13)  Re[7]: サロゲートペアのDB40
□投稿者/ 魔界の仮面弁士 (2816回)-(2020/08/17(Mon) 01:52:42)
No95553 (S.Kos さん) に返信
> くまくまさんへの御礼を含み、もう20行ばかりあるのですが、これを貼り付けると「迷惑投稿者」となってしまいます。

特定のキーワードを含む投稿がブロックされるようになっています。



No95547 (S.Kos さん) に返信
> 二度目以降のDB40を数えない、としたテストコードは、いまのところ問題を生じていません。

「二度目以降」という表現に違和感が…。

異体字セレクタのベース文字がサロゲートペアだとは限りませんし、
異体字セレクタに DB40 が含まれないケースもありますが、その点は大丈夫でしょうか。



> 95544に準えれば、
>  LenExp(「イと七」の「ほっけ」U+29E3D,29E3D_E0102) = 1
>  LenExp(「イとヒ」の「ほっけ」U+29E3D,29E3D_E0104) = 1
>  LenExp(「テ今」U+2B746,2B746_E0101) = 1
> となるような LenExp() を探しています。

手抜き実装ですが、自分も参考までに作ってみました。
「Sub Example()」で出力されるすべてのセルに対して、LenExp が 1 を返せば成功。
https://gist.github.com/Benshi/f49ba168b784c014ce5933c65e350cc1

念のため、サロゲートペアの破損チェックも組み込んであります。
もしもエラー返却だと都合が悪い場合は、
戻り値を負数にして Exit Function するなどしてみてください。



> ・課題の絞り込み
> という訳で、"IPAmj明朝フォント"を用いた姓と名に顕れる「異字体」のみ、を処理できれば十分です。

「異字体」という表現は聞いたことがなかったのですが、
「異体字」のことでしょうか。それとも別の言葉でしょうか。


一連の話題に上がっている "IPAmj明朝" フォントは、
文字情報コレクション (Moji_Joho) のためのものですね。

Moji_Joho は、「戸籍統一文字」と「住民基本台帳ネットワークシステム統一文字」を包含します。
https://mojikiban.ipa.go.jp/3646.html

たとえば漢数字の『八』という文字には、
 住基ネット統一文字コード:J+516B
 住基ネット統一文字コード:J+ADC8
という別のグリフがありますが、戸籍では前者のみが使われます。
https://moji.quus.net/info/7273-516B.htm
https://moji.quus.net/info/7274-516B.htm
https://mojikiban.ipa.go.jp/search/result?UCS=0x516B


一方、何度か登場した汎用電子コレクション (Hanyo-Denshi) では、
それらに加えて「登記固有文字」も含んだ文字集合となります。
Hanyo-Denshi の場合、登記固有文字から作字されたグリフは TKdddddddd の識別子が付きます。
http://kanji-database.sourceforge.net/ivd/hanyo-denshi.html


Unicode の異体字セレクタ (IVS) で表現される場合、
Moji_Joho と Hanyo-Denshi は、同じグリフに対して異体字セレクタが
共有されてはいるものの、いずれか一方にしか含まれない字形もあるため、
完全に互換性があるわけではありません。


No95507 で使おうとしていた 5EE3_E0107 ("廣" の異体字) は現状、
文字情報コレクションには含まれていません。※登記固有文字 TK01028180
この文字を利用するには、汎用電子に対応したフォントが必要です。

No95373 で使おうとしていた 82B1_E0106 ("花" の異体字)はその逆で、
汎用電子コレクションには含まれていないものの、
文字情報コレクションに含まれているため、※MJ021594
"IPAmj明朝" フォントで表示することが出来ます。


> 本(2020)年三月、MSのお達し(苦笑)があった、と知りました。

VBA のコードエディタやイミディエイト ウィンドウや MsgBox は
Shift_JIS ベースなので、この辺は .NET で実装した方が楽なのですけれどね。

たとえば Unicode 12.1.0 で追加された「令和」の合字である『ChrW(&H32FF)』は、
Shift_JIS (およびその派生となるコードページ 932 など)には含まれていないので、
言語仕様上は扱えたとしても、VBA 開発環境では化けてしまう…。


> そう遠くない将来、必須となるかも知れないUnicode体系への移行に備え、様々を手探りしているところです。

Shift_JIS から Unicode への移行は確かに必要ですね。


> 外字で構成する人名を扱うシステムがあります。

昭和以降の日本人の人名だけなら、おそらく大丈夫だとは思いますが、
もしも Unicode に未登録の文字が現れた場合には、
引き続き外字での対応(あるいはフォント切替での疑似表現)が必要になります。

参考:CJK 統合漢字拡張 H
http://unicode.org/L2/L2015/15223-irg-n2091-ext-h-utc.pdf
https://twitter.com/garyoutenseize/status/1026113858383958016


で、問題は異体字。

一口に人名と言っても、戸籍統一文字、住基ネット統一文字、登記統一文字などといった
文字集合があり、それぞれで使用可能な文字群が異なります。ゆえにフォントの選定も重要です。

今回は MJ文字に絞っているようなので、それ以外の文字は基本的に外字対応になりますね。
あるいはフォントを変更するか…。


ちなみに、 No95509 の投稿で使っていた花園フォントは、
GlyphWikiで開発されているオープンソースの漢字フォントです。
https://fonts.jp/hanazono/
http://glyphwiki.org/wiki/GlyphWiki
https://ja.osdn.net/projects/hanazono-font/
https://github.com/cjkvi/HanaMinAFDKO/releases



> 入出力フロントエンドをEXCELで構成し、SQLSERVERに置いたデータとは、ODBCを経由して遣り取りします。

VBA だけでなく、SQL Server も、Unicode IVS を考慮した関数は用意されていなかったはず…。
https://note.gosyujin.com/2019/06/13/sqlserver-varchar-nvarchar/

SQL Server で Unicode を扱うための注意点としては、
 ・varchar を使うな、nvarchar を使え
 ・文字列リテラルは '漢字' ではなく、 N'漢字' を使うべし
 ・サロゲートペアや合成文字の面倒は見てくれないので、そこは自力で何とかする
などが思い当たります。

あと、問題になりやすいのが ORDER BY したときの並び順序。
Shift_JIS の場合、文字は「漢字の読み」の順に登録されていますが、
Unicode では「部首の画数順」で登録されているという違いがあります。

そのため、たとえば、一郎, 二郎, 三郎 などの漢数字を並び替えた場合、
 Shift_JIS: 一, 九, 五, 三, 四, 七, 二, 八, 六
 Unicode: 一, 七, 三, 九, 二, 五, 八, 六, 四
のように変化することになります。
名簿の類ならば、読み仮名データも保持してあるでしょうけれども。



> で、その文字列長の合計 Len(姓)+Len(名) が五文字以下なら、間にスペースを挟んで「姓名を五文字」に揃えます。
> 一覧表に書き出した時の見栄えだけなんですけどね!

フルネームが五文字におさまらない人(勅使河原さんとか、長曾我部さんとか、勘解由小路さんとか)は無加工ですね。


> と並ぶより、
>  大山宗太郎
>  乾   薫
> としたい・・・
なるほど。 No95400 の均等割り付けの件は、その流れだったんですね。
引用返信 編集キー/
■95556 / inTopicNo.14)  Re[8]: サロゲートペアのDB40
□投稿者/ S.Kos (22回)-(2020/08/17(Mon) 10:44:41)
No95555 (魔界の仮面弁士 さん) に返信

いつものことながら、丁寧なご教示、ほんとうにありがとうございます。

>特定のキーワードを含む投稿がブロックされるようになっています。
>
そのキーワードは・・?、と、尋ねるだけヤボ(笑)ですね!

>「二度目以降」という表現に違和感が…。
>
表現そのものがアヤシイ・・下記コードで、今のところ問題を生じていません。
For i = LBound(bytBuf) To UBound(bytBuf) Step 2
surBuf = bytBuf(i) + bytBuf(i + 1) * (2 ^ 8)

If surBuf <> &HDB40& Then
Select Case surBuf

Case &HD800& To &HDBFF& '上位サロゲート
tagLen = tagLen + 1

Case &HDC00& To &HDFFF& '下位サロゲート
'カウントしない

Case Else
tagLen = tagLen + 1

End Select
End If
Next

>手抜き実装ですが、自分も参考までに作ってみました。
>
見させていただきましたが、、

>パブリック関数LenExp (文字列としてのバイヴァルテキスト) 長い間
> 薄暗いローレン長い限り、長さ
> ローレン = レン(テキスト)
>
この表記には、なにかしらの意図があるのでしょうか?

>「異字体」という表現は・・
>
「異字体」でヤッホウ・・「異体字」に変換して探してくれるので、気づきませんでした。

>フルネームが五文字におさまらない人(勅使河原さんとか、長曾我部さんとか、勘解由小路さんとか)は無加工ですね。
>
勘解由小路(カデノコウジ)さんには、直にお会いしたことがあります。
佐々木小次郎さんには、お会いしていませんが(笑)、無加工そのままです。

引用返信 編集キー/
■95558 / inTopicNo.15)  Re[9]: サロゲートペアのDB40
□投稿者/ 魔界の仮面弁士 (2817回)-(2020/08/17(Mon) 11:03:07)
2020/08/17(Mon) 11:43:12 編集(投稿者)

No95556 (S.Kos さん) に返信
>> 特定のキーワードを含む投稿がブロックされるようになっています。
> そのキーワードは・・?、と、尋ねるだけヤボ(笑)ですね!

私もたまにやられてます。文面を削りながら探りましょう。(^_^;)

該当キーワードを探し当てると、「あーこれのことかー!」と膝を叩くことがしばしば。



> 見させていただきましたが、、
>
> >パブリック関数LenExp (文字列としてのバイヴァルテキスト) 長い間
>> 薄暗いローレン長い限り、長さ
>> ローレン = レン(テキスト)

えぇと…
「Public Function LenExp(ByVal text As String) As Long」
って書いてあるはずなので、多分、ブラウザの機械翻訳が
有効になっているんじゃないかなぁ、と。(泣

この化け方は Google ではなく、Microsoft 系だと思います。
たぶん Microsoft Edge でのアクセスですよね。
翻訳を解除しておいてください。

ページを右クリックすると「日本語に翻訳(T)」という
コンテキストメニューが現れると思うのですが、
もしもこれが使用不可になっているなら、絶賛翻訳中ということに。



一応、VS17〜VS256 の範囲のセレクタ (U+E0100 〜 U+E01EF) だけでなく
VS1〜VS16 の範囲 (U+FE00 〜 U+FE0F) についても考慮したつもりですが、
おかしな箇所を見つけたらフィードバックよろしく > ALL


なお、結合文字の類には対応していません。
以下に、正しく算出できないパターンも例示しておきます。


'合成用濁点。Mac 環境で入力されたデータにしばしば見られる正規化。
'明治時代頃の女性名のように、平仮名/片仮名な戸籍データに混入する可能性がある。
Range("A3").Value = ChrW(&H30C7)
Range("A4").Value = ChrW(&H30C6) & ChrW(&H3099)


'ゼロ幅接合子(U+200D)併用のカラー家族絵文字。
'長いけれどこれでも 1 文字。Word に貼ると色付きで表示される。
'流石に人名で絵文字が使われることは無いだろうけれども、
'イスラム系外国人の本名表記などで、U+200D が含まれることがある。
Range("A1:D1").Value _
  = ChrW(&HD83D) & ChrW(&HDC68) & ChrW(&H200D) _
  & ChrW(&HD83D) & ChrW(&HDC69) & ChrW(&H200D) _
  & ChrW(&HD83D) & ChrW(&HDC67) & ChrW(&H200D) _
  & ChrW(&HD83D) & ChrW(&HDC66)


Range("A:A").Font.Name = "游ゴシック"
Range("B1").Font.Name = "Segoe UI Symbol"
Range("C1").Font.Name = "Segoe UI Emoji"
Range("D1").Font.Name = "Segoe UI Emoji"
Range("C1").Value = Range("C1").Value
引用返信 編集キー/
■95562 / inTopicNo.16)  Re[10]: サロゲートペアのDB40
□投稿者/ S.Kos (23回)-(2020/08/18(Tue) 09:22:55)
No95558 (魔界の仮面弁士 さん) に返信
ご教示いただいたコードを取得しました。
コードの内容のみならず、その記述スタイルも参考になります。
ありがとうございました。

くまくまさんへの御礼を書き込めないままです、心残りではありますが、ここらで閉じます。
みなさま、今後ともよろしくオツキアイください。

引用返信 編集キー/
■95572 / inTopicNo.17)  Re[11]: サロゲートペアのDB40
□投稿者/ S.Kos (24回)-(2020/08/18(Tue) 21:19:46)
お恥ずかしい・・・解決済みチェックが抜けてました・・・
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ