|
一般ユーザのたけのこです。
> 詳しくはないのですが、おそらく「|」はRFC等で排除あるいは非推奨とされてい
> るのですね。
ってことです。
秀まるお2さんが前向きな解答をなさっていますが、とりあえずは下記のような
マクロで、選択範囲をまともなキャラでエンコードします。
/* unicode→utf-8はかなり怪しいですが(^^; 本体の関数として実装……して
くれないかなとお願いしてみたり。 */
秀丸で使うときはそのまま使えます。鶴亀で使うときは、受信済みメールの場合
は編集を許可してから使ってください。つーか、受信済みなら、範囲選択後右ク
リック→...を開く、の方が簡単です。このマクロは送信する場合に使用して、
相手がどんなクライアントだろうとokちゅうのが親切な使い方かもしれません。
//-----ここから
if(selecting){
// 元の文字列を取得
$srcStr = gettext(seltopx, seltopy, selendx, selendy);
#sx = seltopx;
#sy = seltopy;
moveto #sx, #sy;
// encoding開始
$destStr = "";
// クエリ文字列まで読み飛ばし
while($srcStr != $destStr){
call getter;
$now = $$return;
$destStr = $destStr + $now;
right;
if($now == "?"){
break;
}
}
// クエリ文字列を符号化
while($srcStr != $destStr){
#cc = unicode;
call getter;
$now = $$return;
if(((#cc >= 'a')&&(#cc <= 'z'))
||((#cc >= 'A')&&(#cc <= 'Z'))
||((#cc >= '0')&&(#cc <= '9'))){
// 英数字はそのまま
right;
}else if((#cc == '=')||(#cc == '&')
||(#cc == '.')||(#cc == '-')
||(#cc == '*')||(#cc == '_')){
// 一部の記号もそのまま
// しかし、本来ならば等号とアンパサンドは、
// デリミタ以外の場合はエンコードしなければならない。
// やろうとするならば、結構まともなパーサが必要
right;
}else if(#cc == ' '){
// 空白は'+'にする
delete;
insert "+";
}else{
// その他はエンコード対象
delete;
call unicode2utf #cc;
$utf = $$return;
#utflen = strlen($utf);
#i = 0;
while(#i < #utflen){
insert "%" + midstr($utf, #i, 2);
#i = #i + 2;
}
}
$destStr = $destStr + $now;
}
}else{
message "符号化範囲を選択して実行してください。";
}
endmacro;
getter:
##sx = x;
##sy = y;
right;
$$text = gettext(##sx, ##sy, x, y);
left;
return $$text;
unicode2utf:
##uni = ##1;
if(##uni < 0x7f){
// 1バイト表現
$$hexa = rightstr("00" + hex(##uni), 2);
}else if(##uni < 0x7ff){
// 2バイト表現
##hex1 = (##uni & 0x7c0) / 64;
##hex2 = ##uni & 0x3f;
$$hexa = rightstr("00" + hex(##hex1 + 0xc0), 2) +
rightstr("00" + hex(##hex2 + 0x80), 2);
}else if(##uni < 0xffff){
// 3バイト表現
##hex1 = (##uni & 0xf000) / 4096;
##hex2 = (##uni & 0xfc0) / 64;
##hex3 = ##uni & 0x3f;
$$hexa = rightstr("00" + hex(##hex1 + 0xe0), 2) +
rightstr("00" + hex(##hex2 + 0x80), 2) +
rightstr("00" + hex(##hex3 + 0x80), 2);
}else if(##uni < 0x1fffff){
// 4バイト表現
##hex1 = (##uni & 0x1c0000) / 262144;
##hex2 = (##uni & 0x3f000) / 4096;
##hex3 = (##uni & 0xfc0) / 64;
##hex4 = ##uni & 0x3f;
$$hexa = rightstr("00" + hex(##hex1 + 0xf0), 2) +
rightstr("00" + hex(##hex2 + 0x80), 2) +
rightstr("00" + hex(##hex3 + 0x80), 2) +
rightstr("00" + hex(##hex4 + 0x80), 2);
}else if(##uni < 0x3ffffff){
// 5バイト表現
##hex1 = (##uni & 0x2000000) / 16777216;
##hex2 = (##uni & 0xfc0000) / 262144;
##hex3 = (##uni & 0x3f000) / 4096;
##hex4 = (##uni & 0xfc0) / 64;
##hex5 = ##uni & 0x3f;
$$hexa = rightstr("00" + hex(##hex1 + 0xf8), 2) +
rightstr("00" + hex(##hex2 + 0x80), 2) +
rightstr("00" + hex(##hex3 + 0x80), 2) +
rightstr("00" + hex(##hex4 + 0x80), 2) +
rightstr("00" + hex(##hex5 + 0x80), 2);
}else{
// 6バイト表現
##hex1 = (##uni & 0x40000000) / 1073741824;
##hex2 = (##uni & 0x2f000000) / 16777216;
##hex3 = (##uni & 0xfc0000) / 262144;
##hex4 = (##uni & 0x3f000) / 4096;
##hex5 = (##uni & 0xfc0) / 64;
##hex6 = ##uni & 0x3f;
$$hexa = rightstr("00" + hex(##hex1 + 0xfc), 2) +
rightstr("00" + hex(##hex2 + 0x80), 2) +
rightstr("00" + hex(##hex3 + 0x80), 2) +
rightstr("00" + hex(##hex4 + 0x80), 2) +
rightstr("00" + hex(##hex5 + 0x80), 2) +
rightstr("00" + hex(##hex6 + 0x80), 2);
}
return $$hexa;
//-----ここまで
(^^)/”
|
|