68user's page 掲示板

Prev< No. 3033> Next  [最新発言に戻る] [過去ログ一覧]
No. 3033 # 68user 2003/01/13 (月) 04:02:59
また長ったらしい文章を書いてしまった…。

>>3031 ふくし
> 68user さん Perl 5.8 入れてみましたか ;;;
5.8 どころか最近は 5.004_04 を使ってますよ。退化してます。

> いぜん jperl5.5 でファイルテスト演算子 -T を使っていたんですが、
> EUC-JP モードであれば EUC-JP の、Shift_JIS モードであれば Shift_JIS の
> 漢字を真にしてくれて便利だったんですが、Perl 5.8 に変えたので
perl-5.8.0/pp_sys.c には
          PP(pp_fttext)
          {
                  for (i = 0; i < len; i++, s++) {
                          if (!*s) { /* null never allowed in text */
                                  odd += len; break;
                          }
          #ifdef USE_LOCALE
                                  if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
                                          continue;
          #endif
                                  /* utf8 characters don't count as odd */
                                  if (UTF8_IS_START(*s)) { ... }
                                  ...
                          }
                          else if (*s < 32 &&
                              *s != '\n' && *s != '\r' && *s != '\b' && *s != '\t' && *s != '\f' && *s != 27)
                                  odd++;
        }
とかなんとか書いてあったりします (UTF8 は OK のような雰囲気ですね)。

USE_LOCALE で IN_LOCALE_RUNTIME ならもしかして! …というわけでさらにおっかけていくと
        % find . -type f | xargs grep isALPHA_LC
        ./handy.h:# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c))
        % find . -type f | xargs grep NXIsAlpha
        ./handy.h: (NXIsAlpha((unsigned int)(c)) || (char)(c) == '_')
        ./handy.h:# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c))
てなわけで NXIsAlpha とやらが定義されていません。isALPHA_LC を
よく見てみると
        #ifdef USE_NEXT_CTYPE
        # define isALPHA_LC(c) NXIsAlpha((unsigned int)(c))
        #else
        # define isALPHA_LC(c) isalpha((unsigned char)(c))
        #endif
てな感じなので、将来は実装するぞ、てなところでしょうか。


>>3032 akuro
> 「さらなる改善点・URL エンコード」の中で、~(チルタ゛)のついた
> 場合、変換しなければならないとあるのですが
URI を定義しているのは RFC1738 です。
      http://www.ietf.org/rfc/rfc1738.txt?number=1738
そこには
      httpurl = "http://" hostport [ "/" hpath [ "?" search ]]
とあります。/~68user/ や /%7E68user/ という部分は hpath に相当します。

      hpath = hsegment *[ "/" hsegment ]
      → hpath は hsegment を / で結合したもの。

      hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
      → hsegment は uchar か上記記号の 0 個以上の繰返し。

      uchar = unreserved | escape
      → uchar は unreserved か escape。

      unreserved = alpha | digit | safe | extra
      escape = "%" hex hex
      → unreserved は alpha, digit, safe, extra のいずれか。escape は %XX 形式。

      alpha = lowalpha | hialpha
      digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
      safe = "$" | "-" | "_" | "." | "+"
      extra = "!" | "*" | "'" | "(" | ")" | ","
      → alpha, digit, safe, extra は上記の文字 (lowalpha は英小文字、hialpha は英大文字)。

上記のどこにも ~ は含まれていません。よって、hpath には ~ を
含めてはならず、/~68user/ は間違いで /%7E68user/ は正しいのです。



…というのはその文書を書いた当時の話。今 URI を規定しているのは RFC2396 です。
      http://member.nifty.ne.jp/moha/rfc/rfc2396j.txt

/~68user/ に相当するのは abs_path です (*1)。
            abs_path = "/" path_segments
            path_segments = segment *( "/" segment )
            segment = *pchar *( ";" param )
            param = *pchar
            pchar = unreserved | escaped |
                                            ":" | "@" | "&" | "=" | "+" | "$" | ","
            reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
            unreserved = alphanum | mark
            mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

mark に ~ が含まれているため、URI として ~ を記述することが認められています。

また、上記ページの「G.2. RFC 1738及びRFC 1808からの修正点」には

> チルダ文字"~"を"unreserved"集合に追加した。ある種のキーボードではこの文字の
> 入力に困難を伴うが、インターネットにおいて広く用いられているためである。

とあります。

よって、現在では /~68user/ というリクエストを送っても問題ありません。ただし
/%7E68user/ という表記も間違いではありません。/~68user/ と /%7E68user/ は
等価です。

# …という解釈でいいのかなぁ。自信がないなぁ。

じゃー昔は /%7E68user/ と書かずに /~68user/ とするとエラーになったのか
というと、そんなことはありませんでした。その理由は
        「~ を ~ として解釈しても誰も (web サーバも web クライアントも)
            困らないので (むしろ便利)、web サーバが気をきかせてくれたから」
だと思います。


(*1)
なぜ /~68user/ が abs_path なのかというと、
      RFC2616 (http://www.studyinghttp.net/rfc_ja/2616/sec3.html#sec3.2.1)

      http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
と定義してあり、さらに
      URL 構文やセマンティクスの定義についての情報については、(RFC 1738 [4] と
      RFC 1808 [11] を置き換えた)
          "Uniform Resource Identifiers (URI): Generic Syntax and Semantics," RFC 2396 参照。
      この規格書では、その規格書にある、"URI-reference", "absoluteURI", "relativeURI",
      "port", "host", "abs_path", "rel_path", "authority" の定義を採用する。
とあるからです。

> それと、次の項目の「301 Moved Permanently」なのですが、
> これも/(スラッシ)無しでも表示されました。
こちらで試してみたところ、

        GET /~68user HTTP/1.0

        HTTP/1.1 301 Moved Permanently
        (略)
        Location: http://jfx.startshop.co.jp/~68user/
        (略)

        <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
        (略)
        </BODY></HTML>

となりました。ここで BODY 部に表示されているのは、
      「あなたが要求したドキュメントはここにあるのでクリックしてね」
という web サーバが生成した文章ですので、正しい挙動だと思います。

Prev< No. 3033> Next  [最新発言に戻る] [過去ログ一覧]