マクロでの Unicodeの扱いNo.00644
IKKI さん 07/04/02 02:21
 
IKKI です。こんにちは。
マクロの Unicode 対応についてわからない点が出てきました。

■unichar() の返り値について(1)

  strstr("あ", char(ascii("あ")))                   ==  0
  strstr("あ", unichar(unicode("あ")))              == -1 ???
  strstr("あ", char(ascii(unichar(unicode("あ"))))) ==  0

2行目も 0 になることを期待していました。
"あ" を "\u3042" と書いても結果は同じでした。
これは unichar() の不具合でしょうか?

■unichar() の返り値について(2)

  insert char(0x0A); // 改行が挿入される
  insert char(0x0D); // 改行が挿入される
  insert unichar(0x0A); // ^J が挿入される
  insert unichar(0x0D); // ^M が挿入される

3,4行目も改行が挿入されることを期待していました。

これは想像ですが、ひょっとして文字列変数は内部的には2種類あって
(たとえば「SJIS文字列」と「Unicode文字列」のような)、
これらを内容や文脈によって互いに変換したりしているのでしょうか。

■Unicode にしかない文字の判定方法

たとえば「*」が SJIS では表現できない文字だとして、

 (a) カーソル位置の「*」を code で読むと 0
 (b) 文字列変数中の「*」を ascii() で1バイトずつ読むと 1A 3F (^Z ?)

になります。「*」が Unicode 文字であることの判定方法は

 (1) if (code == 0) ...
 (2) if (ascii() == 0x1A) ...

という2つが考えられますが、これらの方法は確実でしょうか。
ascii() はすべての Unicod 文字に対して必ず ^Z ? を返すでしょうか。

ちなみに、(b)はどのような意図でこういう値を返しているのでしょうか。
(^Z は文書中に出現しないという仮定がある気がします?)


以上、ご教示いただければ幸いです。

[ ]
RE:00644 マクロでの Unicodeの扱いNo.00649
秀丸担当 さん 07/04/02 17:55
 

>■unichar() の返り値について(1)
>■unichar() の返り値について(2)

これはunicharでShift-JISにもある文字なのに変数中には違う文字として保持さ
れてしまっていて、不具合と考えていただいたほうがいいようです。
同じ文字は同じになるように修正させていただきます。

> (1) if (code == 0) ...
> (2) if (ascii() == 0x1A) ...
>
>という2つが考えられますが、これらの方法は確実でしょうか。
>ascii() はすべての Unicod 文字に対して必ず ^Z ? を返すでしょうか。

(2)のほうは、V6.50βで起きてしまった不具合でした。
申し訳ありません。
asciiの場合は'?'の文字相当の0x3fが入ることになっていますが、そうなってい
ませんでした。
(1)のほうがいまのところ判断する方法ということになります。

[ ]
RE:00649 マクロでの Unicodeの扱いNo.00651
IKKI さん 07/04/02 20:46
 
IKKI です。ご回答ありがとうございます。

> これはunicharでShift-JISにもある文字なのに変数中には違う文字として保持さ
> れてしまっていて、不具合と考えていただいたほうがいいようです。
> 同じ文字は同じになるように修正させていただきます。

仕様上は文字列変数に SJIS/Unicode の区別はない、ということですね。
(Unicode か否かで動作が違う場合はバグを疑ってよい、と理解しました)

実装上はすべて Unicode で保持してるのでしょうか?
(企業秘密でしたらごめんなさい。これがわかれば、速いマクロを書いたり
怪しい動作の原因を突き止めたりする手がかりになると思いました)

> > (1) if (code == 0) ...
> > (2) if (ascii() == 0x1A) ...
>
> (2)のほうは、V6.50βで起きてしまった不具合でした。
> asciiの場合は'?'の文字相当の0x3fが入ることになっていますが、そうなってい
> ませんでした。
> (1)のほうがいまのところ判断する方法ということになります。

わかりました。その仕様だと

  strlen("*") == 2

であっても

  strlen(char(ascii("*"))) == 1

になるわけですね。ところで

  ascii(rightstr("*", 1))

は何が返ってくる仕様になっているでしょうか。

[ ]
RE:00651 マクロでの Unicodeの扱いNo.00653
秀丸担当 さん 07/04/03 16:05
 

>仕様上は文字列変数に SJIS/Unicode の区別はない、ということですね。
>(Unicode か否かで動作が違う場合はバグを疑ってよい、と理解しました)

そういうことでお願いします。

>実装上はすべて Unicode で保持してるのでしょうか?
>(企業秘密でしたらごめんなさい。これがわかれば、速いマクロを書いたり
>怪しい動作の原因を突き止めたりする手がかりになると思いました)

基本的にはフォントの文字セット(Shift-JIS)で、それに含まれないものを
Unicodeな特別な文字として保持しています。

>  strlen("*") == 2
>
>であっても
>
>  strlen(char(ascii("*"))) == 1
>
>になるわけですね。ところで

これはいずれも2になるはずで、Unicodeの独自な文字であっても全角か半角か
を区別していて、全角の場合は全角の'?'にして、桁位置などがずれないように
しています。

>  ascii(rightstr("*", 1))
>
>は何が返ってくる仕様になっているでしょうか。

rightstrはShift-JISであれば全角の2バイト目が返っているので、それと同様
に'?'の2バイト目が返ってくるはずだと思います。
半分のバイトのままだと、全角の計算が合わずにいろいろ変になってしまうと思
います。

[ ]
RE:00653 マクロでの Unicodeの扱いNo.00657
IKKI さん 07/04/03 23:25
 
IKKI です。

> 基本的にはフォントの文字セット(Shift-JIS)で、それに含まれないものを
> Unicodeな特別な文字として保持しています。

単純なバイト列ではなくて、1文字ごとに何かしら付加情報を持っているということ
ですね。

> >  strlen("*") == 2
> >  strlen(char(ascii("*"))) == 1
>
> これはいずれも2になるはずで、Unicodeの独自な文字であっても全角か半角か
> を区別していて、全角の場合は全角の'?'にして、桁位置などがずれないように
> しています。
>
> >  ascii(rightstr("*", 1))
>
> rightstrはShift-JISであれば全角の2バイト目が返っているので、それと同様
> に'?'の2バイト目が返ってくるはずだと思います。

以上、了解です。ありがとうございました。

[ ]