Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
VBAでサロゲートペアを・・
投稿日時: 20/08/14 05:03:31
投稿者: S.Kos

みなさま、こんにちは。
 
過日の「1文字が2バイトとは限らないUnicode文字列の扱いについて」で、
MMYSさんから、
>LEN関数は、サロゲートペアに非対応という、バクに近い仕様。
>
とご教示いただきました。
 
では、と、VBAによるサロゲートペアの扱いを模索するうちに、以下に気づきました。
 
IPAmj明朝フォントを設定したシートで、A列1行から4行目までに、
 ツクリが「イヒの花」である「ほっけ」
 ツクリが「イ七の花」である「ほっけ」
 いわゆる「ツチよし」
 テンが無い「富」
を配置して、下記コードを実行すると、
 
Private Sub CommandButton1_Click()
  Dim yPos As Long
   
  For yPos = 1 To 4
    Cells(yPos, 2).Value = Len(Cells(yPos, 1).Value)
  Next
End Sub
 
B列に 4、2、2、1 と書き出されます。
 
非対応だから、と言ってしまえばそれまでですが、このことの背景をご教示いただければ幸いです。
 
 
 

回答
投稿日時: 20/08/14 10:14:43
投稿者: WinArrow
投稿者のウェブサイトに移動

私もにわか勉強ですが、
Unicodeには、幾つかの種類があります。
 
Unicodeの種類を勉強してみましょう。
LEN関数だけで対応とするのではなく。
その種類を判別する方法を習得することをお勧めします。
 
※関数もプおグロラムです。
※プログラムには、生まれた背景などが前提となっています。
※新しい環境が生まれたからといって、全てのプログラムが新しい環境に対応できるとは限りません。
※「バグ」なのか「仕様」なのかは、詮索してもどうしようもないと考えます。

回答
投稿日時: 20/08/15 11:20:38
投稿者: MMYS

調べてみると以下のようです。
わかりやすく言うと、文字のマイナーバージョン。
 
Unicodeとは? その歴史と進化、開発者向け基礎知識
https://www.buildinsider.net/language/csharpunicode/01
 
まず、Unicodeの基本(UTC16)は次の通り。
・世界共通のコード
・似た文字は1つの文字に集約
・Unicodeは2バイトで1文字を表します。
・一部の文字は4バイト(サロゲートペア)
 
Unicodeは似た文字は1つの文字に集約して登録文字数を減らしています。
主要文字は網羅されてますから日常は困りません。
通常の用途はこれで十分です。ところが一部の用途は困ります。
 
経産省「文字情報基盤整備事業」の解説に下記があります。
https://mojikiban.ipa.go.jp/1292.html
 
IVSサンプルHTML
https://mojikiban.ipa.go.jp/1792.html
 
 
要するに、Unicodeは主要文字1文字だけが登録されていて、
その文字によく似た文字は枝番で対応。
 

<html>
<head>
</head>
<body>
&#x845B;&#xE0100;
&#x845B;&#xE0101
<br>
&#x8FBB;&#xE0100;
&#x8FBB;&#xE0101;
</body>
</html>

上記内容てhtmlを作成して、ブラウザで表示して下さい。
&#x845Bは主文字。続いて&#xE0100;が枝番。
 
 
IVS・異体字セレクタ は歴史が浅く、対応ソフトも少ないです。
ExcelがIVSに対応はExcel2013からです。Excel2010は非対応(アドイン扱い)。
 
現状では標準フォントファイルが対応しておらず、ほとんどのパソコンでは扱えません。
 
 
異体字セレクタ
https://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF
 
普及が期待される新しい仕組み・IVS
https://fontnavi.jp/zakkuri/307-IVS.aspx
 
UnicodeのIVSがもたらすメリットとデメリット
https://xtech.nikkei.com/it/article/COLUMN/20110124/356398/
 
 

回答
投稿日時: 20/08/15 11:30:57
投稿者: MMYS

WinArrow さんの引用:

Unicodeには、幾つかの種類があります。

今回のケースはメモリ内でどのように格納されてるかですから UTC-16 の理解かな。
 
 
WinArrow さんの引用:

※「バグ」なのか「仕様」なのかは、詮索してもどうしようもないと考えます。

Unicodeは2バイトの固定長が当初の仕様。
なので、VBAに限らず、VBscriptなども未対応のようです。
 
ところで、VBAの標準ファイル関連命令はUnicode非対応です。
例えば下記の命令はエラーです。
 
Me.Picture = LoadPicture(Unicodeのファイル名)
 

投稿日時: 20/08/16 09:40:35
投稿者: S.Kos

MMYSさん、丁寧なご教示のほど、ありがとうこざいました。
 
UNICODEそのものはもちろんですが、異字体セレクタへの理解が欠けている、と実感しました。
提示していただいたサイトなど、彷徨い歩くこととしましよう。
 
ありがとうこざいました。ここで閉じます。