その昔日本語(Shift-JIS)は半角と全角しかなかったので「半角文字か2バイト文字」とか判別していた
「半角かな」も混じっていたし当時のコンパイラの長さを求める関数も「あいう」なら「6」と返していた
(秀丸マクロは互換性のためいまでも全角文字は2文字として数えます)
UniCode が広まってもうその考えもほぼほぼ不要になってきて全ての種類を判断して「文字」として数えてくれるようになった
ただ簡単で便利になった反面場合によってはそんな仕様がかえって困ることになる
今回の
┌―――┐
|あいう|
└―――┘
選択文字を罫線で囲むというだけの簡単なマクロでも罫線「―」は全角なので
┌―――┐
|aいう|
└―――┘
の様な場合に判別して後ろに半角スペースを追加しなければならない
このとき UniCode が混ざると昔ながらの方法で単純に「AnsiString」に変換して長さを測るとかは出来ない
┌―――┐
|আ¶£|
└―――┘
とかなるときにどう判断すればいいのかと考えた結果単純な方法でやっつけた
//半角英数字の長さなら何文字か返す
//KiriAge が True なら小数値は切り上げ False なら四捨五入
function ASCIILength(S:string;KiriAge:Boolean):integer;
var
F:Extended;
begin
F:=Canvas.TextWidth(S)/Canvas.TextWidth('q');//Canvas が等幅フォント前提
if KiriAge then
begin
if Frac(F)<>0 then Result:=Trunc(F)+1 else Result:=Trunc(F);
end else
begin
if F>=0 then Result:=Trunc(F+0.5) else Result:=Trunc(F-0.5);
end;
end;
それは半角英数字の何文字相当なのかという関数
中でやってることは「とりあえず書いたらどれだけの長さになるのか」だけ
多分これで解決したんだけれどもそんなことをやっているとき秀丸を見て気づいたんだけど
同じフォントにしても微妙に違うの笑う