Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://mocaskr.blog42.fc2.com/tb.php/7-767a3915

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

URIのデコード(js)

URI(URL)の%エスケープ エンコーディングのデコードをするマクロです。
URIの文字列は、英数と一部の記号以外%xxという数値に変換されてしまいます。
これでは読めないので、"テキストデータの一部を違う文字コードとして変換する”というサクラエディタらしい機能を使って デコードをするマクロを作ってみました。
コードは長いので追記に書いておきます。

使い方は、URI部分を選択して、マクロを実行するだけです。
複数のURIは別々に選択して実行しないと、異なったエンコーディングで変換できません。
文字エンコーディングの自動認識に失敗して読めなかった場合は、まず1回だけ「元に戻す」を行います。 この状態だとSJIS以外だったら読めないので、メニューの[変換]-[文字コード変換]にある「xxx→SJISコード変換」から、手動で選んでください。

※sakura 2.xでは正常に動作しません。
2.x用はsakura wikiにおいてあります。

// SakuraEditor JScript macro
// sakura 1.5.5.0 以上
function URIEncodingToOctet()
{
  var i = 0;
  var uristr = Editor.GetSelectedString( 0 );
  var insmode = Editor.IsInsMode();
  if( "" == uristr ){
    return;
  }
  //上書きモードだったら、一時挿入モードに変更
  if( false == insmode ){
    Editor.ChgmodINS();
  }
  Editor.Delete(); // 範囲選択内を削除。選択解除
  Editor.CharIme( 0x20 ); // スペースを挿入
  Editor.Left(); // 左へ移動
  Editor.MoveHistSet();
  for( i = 0; i < uristr.length; i++ ){
    if( uristr.charAt( i ) == "%" ){
      if( i + 2 < uristr.length ){
        var Hex1 = uristr.charAt(i+1).toUpperCase();
        var Hex2 = uristr.charAt(i+2).toUpperCase();
        if( ((Hex1 >= "0" && Hex1 <= "9") ||
            (Hex1 >= "A" && Hex1 <= "F")) &&
            ((Hex2 >= "0" && Hex2 <= "9") ||
            (Hex2 >= "A" && Hex2 <= "F")) ){
          Editor.CharIme( parseInt( Hex1 + Hex2, 16 ) );
          i += 2;
          continue;
        }
      }
    }
    // 改行コード対策処理
    if( uristr.charCodeAt( i ) < 0x20 ){
      if( uristr.charCodeAt( i ) == 0x0d ){
        if( i + 1 < uristr.length &&
            uristr.charCodeAt( i + 1 ) == 0x0a ){
          Editor.InsText( "\r\n" );
          i += 1;
          continue;
        }
      }
      Editor.InsText( uristr.charAt( i ) );
    }else{
      Editor.CharIme( uristr.charCodeAt( i ) );
    }
  }
  Editor.Delete();  // 追加しておいたスペースを削除
  Editor.MoveHistPrev();
  Editor.BeginSelect();
  Editor.MoveHistNext();
  Editor.Left();
  Editor.Right();
  // UTF-8専用にするには、UTF8ToSJIS()に変えてください。
  Editor.AutoToSJIS();
  if( false == insmode ){
    Editor.ChgmodINS();
  }
}

URIEncodingToOctet();

このマクロではInsText、CharImeが混在していたり、一見無意味な処理もしています。
またCharImeの使い方が特殊なため、将来のバージョンとの互換性などは、一切保障できません。
その理由や解説は、また今度にします。

スポンサーサイト
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://mocaskr.blog42.fc2.com/tb.php/7-767a3915

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。