Bug #1787
closedURI ライブラリの正規表現パターン
Description
=begin
Ruby 1.9 の正規表現で \d の意味が変わっているので、全角数字が URI として通ってしまいます。URI が BINARY のみを対象にしているのであれば、この限りではありません。
irb(main):001:0> require "uri"
=> true
irb(main):002:0> URI("tag:example.jp:/紅玉")
URI::InvalidURIError: bad URI(is not URI?): tag:example.jp:/紅玉
from uri/common.rb:156:in split' from uri/common.rb:174:in
parse'
from uri/common.rb:626:in parse' from uri/common.rb:724:in
URI'
from (irb):2
from bin/irb:12:in `'
irb(main):003:0> URI("tag:example.jp:/1")
=> #<URI::Generic:0x00000001673888 URL:tag:example.jp:/1>
Expected: => URI::InvalidURIError¶
irb(main):004:0> URI.escape("紅玉1.9")
=> "%E7%B4%85%E7%8E%89\xEF\xBC\x91%EF%BC%8E\xEF\xBC\x99"
Expected: => "%E7%B4%85%E7%8E%89%EF%BC%91%EF%BC%8E%EF%BC%99"¶
=end
Files
Updated by drry (drry ) over 15 years ago
- File lib_uri_common.patch lib_uri_common.patch added
=begin
ごめんなさい、patch にまったく関係のない変更が混入しておりました。訂正します。
=end
Updated by drry (drry ) over 15 years ago
- File lib_uri_common-r2.patch lib_uri_common-r2.patch added
=begin
たびたびすみません。別件で、初期化が適切でないために URI::Generic::PORT が /^$/ になってしまっていることに気が付きました。そのため URI::Generic#port= が文字列を受け付けなくなっています。
URI.parse("http://example.jp/").port="81" #=> URI::InvalidComponentError
=end
Updated by tadf (tadayoshi funaba) over 15 years ago
=begin
Ruby 1.9 の正規表現で \d の意味が変わっているので、全角数字が URI として通ってしまいます。URI が BINARY のみを対象にしているのであれば、この限りではありません。
話が少しずれますが、標準ライブラリでは、少くとも scanf、time、date など
で同様の問題がでるように思います。一般に、\d が [0-9] ではなくなった事
態にどう対処するのが正しいでしょうか。
=end
Updated by naruse (Yui NARUSE) over 15 years ago
- Assignee set to tadf (tadayoshi funaba)
=begin
Ruby 1.9 の正規表現で \d の意味が変わっているので、全角数字が URI として通ってしまいます。URI が BINARY のみを対象にしているのであれば、この限りではありません。
話が少しずれますが、標準ライブラリでは、少くとも scanf、time、date など
で同様の問題がでるように思います。一般に、\d が [0-9] ではなくなった事
態にどう対処するのが正しいでしょうか。
個別具体的に、そのライブラリに置いて \d と [0-9] のどちらが「正しい」かを判断する事になります。
URIは許さない方がいいでしょうし、timeやdateでは許してもよいかもしれません。
=end
Updated by tadf (tadayoshi funaba) over 15 years ago
=begin
話が少しずれますが、標準ライブラリでは、少くとも scanf、time、date など
で同様の問題がでるように思います。一般に、\d が [0-9] ではなくなった事
態にどう対処するのが正しいでしょうか。個別具体的に、そのライブラリに置いて \d と [0-9] のどちらが「正しい」かを判断する事になります。
URIは許さない方がいいでしょうし、timeやdateでは許してもよいかもしれません。
\d が一般化された意義は理解しますが、[0-9] と同等でなくなった事は、いい
事ばかりでもないように感じます。以前と同じ意味を表現したいが為にほとん
どすべての \d を [0-9] に置き換えるのは大変です。可読性、保守性の面でも
望ましくないと思います。
\d と書いて、[0-9] と同等であると示す方法があれば、[0-9] と書くよりよい
し、むしろ意図が明確になると思いますが、そういうものを検討する余地はあ
るでしょうか。
=end
Updated by tadf (tadayoshi funaba) over 15 years ago
- Assignee changed from tadf (tadayoshi funaba) to matz (Yukihiro Matsumoto)
=begin
どう考えても僕の担当すべき問題じゃないのでとりあえず変更
=end
Updated by naruse (Yui NARUSE) over 15 years ago
=begin
成瀬です。
Tadayoshi Funaba wrote:
話が少しずれますが、標準ライブラリでは、少くとも scanf、time、date など
で同様の問題がでるように思います。一般に、\d が [0-9] ではなくなった事
態にどう対処するのが正しいでしょうか。
個別具体的に、そのライブラリに置いて \d と [0-9] のどちらが「正しい」かを
判断する事になります。
URIは許さない方がいいでしょうし、timeやdateでは許してもよいかもしれません。
\d が一般化された意義は理解しますが、[0-9] と同等でなくなった事は、いい
事ばかりでもないように感じます。以前と同じ意味を表現したいが為にほとん
どすべての \d を [0-9] に置き換えるのは大変です。可読性、保守性の面でも
望ましくないと思います。\d と書いて、[0-9] と同等であると示す方法があれば、[0-9] と書くよりよい
し、むしろ意図が明確になると思いますが、そういうものを検討する余地はあ
るでしょうか。
ちなみに、
:\d は \p{Nd}
Unicode Technical Report、Perl、Python、.NET
:\d は [0-9]
Java, ECMAScript
という感じのようです。
http://unicode.org/reports/tr18/
http://docs.activestate.com/activeperl/5.10/lib/pods/perlrecharclass.html
http://docs.python.org/3.1/library/re.html
http://msdn.microsoft.com/ja-jp/library/20bw873z(VS.80).aspx
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/regex/Pattern.html
--
NARUSE, Yui naruse@airemix.jp
=end
Updated by matz (Yukihiro Matsumoto) over 15 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:39017] Re: [Bug #1787] URI ライブラリの正規表現パターン"
on Wed, 5 Aug 2009 05:14:13 +0900, "NARUSE, Yui" naruse@airemix.jp writes:
|> \d が一般化された意義は理解しますが、[0-9] と同等でなくなった事は、いい
|> 事ばかりでもないように感じます。以前と同じ意味を表現したいが為にほとん
|> どすべての \d を [0-9] に置き換えるのは大変です。可読性、保守性の面でも
|> 望ましくないと思います。
|>
|> \d と書いて、[0-9] と同等であると示す方法があれば、[0-9] と書くよりよい
|> し、むしろ意図が明確になると思いますが、そういうものを検討する余地はあ
|> るでしょうか。
|
|ちなみに、
|:\d は \p{Nd}
| Unicode Technical Report、Perl、Python、.NET
|:\d は [0-9]
| Java, ECMAScript
|という感じのようです。
ううむ。では、\d は [0-9] にしましょうか。で、[[:digit:]] も
用意する?
=end
Updated by naruse (Yui NARUSE) over 15 years ago
- Status changed from Open to Assigned
=begin
r24544にて\d,\s,\wを1.8仕様に戻しました。
なお、[[:digit:]]等は1.9ではもともと鬼車由来で存在します。
これらはUnicode系にマッチさせる際にはUnicodeを意識するままにしてあります。
http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
=end
Updated by naruse (Yui NARUSE) over 15 years ago
=begin
POSIX文字クラスはどうします?今はUnicodeの場合はUnicode意識になっていますが >まつもとさん
=end
Updated by matz (Yukihiro Matsumoto) over 15 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:39088] [Bug #1787] URI ライブラリの正規表現パターン"
on Sun, 16 Aug 2009 22:46:45 +0900, Yui NARUSE redmine@ruby-lang.org writes:
|POSIX文字クラスはどうします?今はUnicodeの場合はUnicode意識になっていますが >まつもとさん
[[:alnum:]]とかですか。Unicode意識でよいんじゃないでしょうか。
=end
Updated by naruse (Yui NARUSE) about 15 years ago
- Status changed from Assigned to Closed
=begin
とりあえずこの話は片付いたと思われるのでcloseします。
=end
Updated by naruse (Yui NARUSE) about 15 years ago
=begin
成瀬です。
[[:alnum:]] のような、POSIX 文字クラスは、先日の話では、
以下の通り Unicode 準拠とするという話になりました。
2009/08/16 23:09, Yukihiro Matsumoto wrote:
In message "Re: [ruby-dev:39088] [Bug #1787] URI ライブラリの正規表現パターン"
on Sun, 16 Aug 2009 22:46:45 +0900, Yui NARUSEredmine@ruby-lang.org writes:|POSIX文字クラスはどうします?今はUnicodeの場合はUnicode意識になっていますが >まつもとさん
[[:alnum:]]とかですか。Unicode意識でよいんじゃないでしょうか。
一方で、Perl 5.11.0 でもこのスレッドと同旨の変更を行っているんですが、
こちらでは POSIX もオリジナルの定義に戻っています。
というわけで、Perl 5.11 に合わせませて、ASCII の範囲のみにしませんか。
参考:
POSIX Esc Class New-Property ! Old-Property
----------------------------------------------+-------------
alnum [0-9A-Za-z] IsPosixAlnum ! IsAlnum
alpha [A-Za-z] IsPosixAlpha ! IsAlpha
ascii [\000-\177] IsASCII = IsASCII
blank [\011 ] IsPosixBlank !
cntrl [\0-\37\177] IsPosixCntrl ! IsCntrl
digit \d [0-9] IsPosixDigit ! IsDigit
graph [!-~] IsPosixGraph ! IsGraph
lower [a-z] IsPosixLower ! IsLower
print [ -~] IsPosixPrint ! IsPrint
punct [!-/:-@[-`{-~] IsPosixPunct ! IsPunct
space [\11-\15 ] IsPosixSpace ! IsSpace
\s [\11\12\14\15 ] IsPerlSpace ! IsSpacePerl
upper [A-Z] IsPosixUpper ! IsUpper
word \w [0-9A-Z_a-z] IsPerlWord ! IsWord
xdigit [0-9A-Fa-f] IsXDigit = IsXDigit
http://cpansearch.perl.org/src/JESSE/perl-5.11.0/pod/perl5110delta.pod
--
NARUSE, Yui naruse@airemix.jp
=end
Updated by matz (Yukihiro Matsumoto) about 15 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:39438] Re: [Bug #1787] URI ライブラリの正規表現パターン"
on Tue, 6 Oct 2009 14:19:32 +0900, "NARUSE, Yui" naruse@airemix.jp writes:
|> [[:alnum:]]とかですか。Unicode意識でよいんじゃないでしょうか。
|
|一方で、Perl 5.11.0 でもこのスレッドと同旨の変更を行っているんですが、
|こちらでは POSIX もオリジナルの定義に戻っています。
|
|というわけで、Perl 5.11 に合わせませて、ASCII の範囲のみにしませんか。
うーん、そうするとPropertyを使ったプログラミングが難しくなり
ませんか。\p{Alnum}とかを使え、ということなのでしょうか。
でも、
|http://cpansearch.perl.org/src/JESSE/perl-5.11.0/pod/perl5110delta.pod
Previous versions of Perl tried to map POSIX style
character class definitions onto Unicode property names so
that patterns would "dwim" when matches were made against
latin-1 or unicode strings. This proved to be a mistake,
breaking character class negation, causing forward
compatibility problems (as Unicode keeps updating their
property definitions and adding new characters), and other
problems.
というもわからないでもないですねえ。どうしましょうか。
=end
Updated by drry (drry ) about 15 years ago
- File lib_uri_common-r3.patch lib_uri_common-r3.patch added
- File lib_uri_common-r3-w.patch lib_uri_common-r3-w.patch added
=begin
検討および対応していただき、どうもありがとうございます。
http://redmine.ruby-lang.org/issues/show/1787#note-2 の件もよろしくお願いします。
問題解決のための差分を添えておきます。(r3)
ついでにインデントの混在を整理した差分も添えてあります。(r3-w)
=end