<アイデア募集>文字の名前を知る方法No.11113
でるもんたいいじま さん 23/02/04 16:20
 
でるもんた・いいじまです。

秀丸上で「Unicodeのコードポイントから、その文字の名前を知る方法」をさがして
います。

☆ ☆ ☆

条件は次の通り。

@とりあえず、秀丸9.xx (32bit/64bit版) で動けばいい。ただし、XP/Vistaを見捨
てるのは避けてほしい。

ABMP以外の文字にも対応してほしいし、Unicodeの規格改定にも常時追随してほしい。

B漢字については、文字名自体は機械的な命名法なので必要ないが、どのセットに入
っているのか(基本セット、互換A、拡張B、etc)の情報があると嬉しい。

C手元には MinGW-w64(32bit・64bit両方)と ActivePerl をインストール済みです。
なので、「DLLのソースコードは既に存在するから、あとは http://ftp.unicode.org
/ から最新の文字リストをダウンロードして、それをC言語に変換してビルドして
ね」という解法も使えます。

この条件下で、何かいいソリューションをご存じないでしょうか。
特に、「その目的のDLLは既に◯◯に存在するから、秀丸用のラッパーDLLを作ればそ
れでゴールだよ」という情報があるとありがたいです。

※特定のスクリプト言語のパッケージを丸ごとインストールしなさい、はご勘弁くだ
さい^^ 特定のパッケージから特定のDLLを抜き出せば使えますよ、は大歓迎です。

☆ ☆ ☆

ちなみにご存じの方も多いとは思いますが、Windows自体にも一応この機能はあって、
getuname.dllというDLLから下記の関数がエクスポートされています。

DWORD GetUName(IN WCHAR c, OUT LPWSTR buffer, IN DWORD len);

ところが、

@第一引数cの型は、ネット上の資料ではDWORDと書かれていることが多いですが、実
際に0x20000台の値を与えてみても、下16bitだけしか見てくれません。

B第三引数lenにはバッファのサイズを指定するはずなのですが、明らかに小さすぎ
る値、たとえば4を指定しても、その文字数を超えたデータがバッファにかきこまれ
てしまいます。

というわけで、Aはバッファサイズに余裕を持たせておけば実質大丈夫だろうけど、
@の状況ではちょっと使えないな、と。

☆ ☆ ☆

以上、何かご存じの方がいらっしゃいましたらよろしくお願いしま。

P.S.
Excel上でいろいろ試してみたテストコードを添付しておきます。

'-------------------------
#If VBA7 Then
    Declare PtrSafe Function GetUName Lib "getuname.dll" (ByVal c As Long, _
        ByRef lpBuffer As Integer, ByVal nBufSize As Long) As Long
#Else
    Declare Function GetUName Lib "getuname.dll" (ByVal c As Long, _
        ByRef lpBuffer As Integer, ByVal nBufSize As Long) As Long
#End If

Option Base 0

Function charName(c As Long) As Variant
    Dim buf(1024) As Integer
    Dim ret As Long, L As Long
    L = UBound(buf)

    buf(0) = Asc("*")
    buf(1) = 0
    ret = GetUName(c, buf(0), L)  ' Testing param#3 := 4 ... the function st
ill returns a long text.
    If ret > L Then
        charName = CVErr(xlErrValue)
        Exit Function
    End If

    Dim s As String, i As Long
    s = ""
    For i = 0 To L
        If buf(i) = 0 Then Exit For
        s = s & ChrW(buf(i))
    Next
   
    charName = s
End Function
'-------------------------

[ ]
RE:11113 <アイデア募集>文字の名前を知るNo.11114
秀丸担当 さん 23/02/06 16:16
 
試してみたわけではないですが、ICUのライブラリを使うと、何かしらありそうな気
はします。
https://icu.unicode.org/
Windows 10 Version 1903以降だと、Windows標準のAPIとしてこれのサブセット版(?)
みたいのが使えます。
xpでも最新を常時追うとなると、ライブラリの最新は既にWindows7以降となっている
みたいなので、要件には合わないかもしれません。

昔からあるものでunicode.orgの
https://unicode.org/Public/UNIDATA/
にあるテキストファイルのどれかを適時ダウンロードして、そこから検索すると簡単
かもしれないです。

[ ]
RE:11114 <アイデア募集>文字の名前を知るNo.11115
でるもんたいいじま さん 23/02/07 16:12
 
いいじまです。返信ありがとうございます。

☆ ☆ ☆

> 試してみたわけではないですが、ICUのライブラリを使うと、何かしらありそうな
>気はします。
> https://icu.unicode.org/

ざっとトップページだけ覗いてみました。
ざっと見た限り、ソースコードをgitでダウンロードして、patch.exeと自作perlスク
リプトで少々の加工をして、そのままMinGW-w64でビルド、という手順でいけそうで
すね。

> Windows 10 Version 1903以降だと、Windows標準のAPIとして
> これのサブセット版(?)みたいのが使えます。

なるほど。最近は技術資料をほとんど購入していないので知りませんでした。

> xpでも最新を常時追うとなると、ライブラリの最新は
> 既にWindows7以降となっているみたいなので、
> 要件には合わないかもしれません。

そうですか…まあ、VC++が既にXPを見捨てているので仕方がないですね。
とはいえ、XPでの利用は急ぎではないので、実際に必要になった時点で「ソースコー
ドから自前でビルド」という方法で対処しようと思います。

☆ ☆ ☆

> 昔からあるものでunicode.orgの
> https://unicode.org/Public/UNIDATA/
> にあるテキストファイルのどれかを適時ダウンロードして、
> そこから検索すると簡単かもしれないです。

<前置き>
あ、このURLでいけましたか。今まで
https://ftp.unicode.org/Public/
というURLを使っていたのですが、なぜか最近はブラウザがセキュリティ警告を出す
ようになったので、困っていたところでした^^

http://ftp.unicode.org/ なら無事に通りますが、
#ここから1つでもリンクを辿ろうとするとレスポンスヘッダに
#「https使ってね」という情報が入っているのでまた困る、という。
</前置き>

で、結局、ここのフォルダから UnicodeData.txt を引っ張ってくるというのも確か
にアリですね。
DLLにして流通させる前提なので、頑張ってSTLなしで実装したいところですが、果た
してどこまでスピードとセキュリティを維持できるか。

[ ]