From: Tanaka Akira Date: 2008-08-05T19:12:26+09:00 Subject: [ruby-dev:35769] Re: "\x01\x00\x00\x00\x00\x00\x00\x21".encode("utf-8", "utf-32be", :invalid=>:replace) In article <48935949.6010302@airemix.jp>, "NARUSE, Yui" writes: > ./ruby -e 'puts"\x01\x00\x00\x00\x00\x00\x00\x21".encode("utf-8", "utf-32be", :invalid=>:replace).dump' > の方が書きやすくないですかね。 なるほど。 > さておき、 > 1. "\x01\x00\x00" invalid確定 → REPLACEMENT CHARACTER いえ、INVALID が起動するのは最初の \x01 を読んだ段階です。 > 2. "\x00\x00\x00\x00" → NUL > 3. "\x21" invalid → REPLACEMENT CHARACTER > ってことなんでしょうね。 不正なエンコーディングであることが、最初のバイトでなく、ふた つめのバイトで検出可能になるときは、4バイト境界からずれませ ん。 % ./ruby -e 'puts"\x00\xff\x00\x00\x00\x00\x00\x21".encode("utf-8", "utf-32be", :invalid=>:replace).dump' "\xEF\xBF\xBD!" これは、\xff で問題が判明しても即座には INVALID にせず、4バ イト境界まで読み飛ばすようになっているからです。 最初のバイトで見つけた時にそういう仕掛けが実装されていないの は単に忘れてるという話なんじゃないですかね。 > つまるところ、これは invalid をビット化けに最適化するか、 > ビット落ちに最適化するかの話なのかなぁ。 > どちらの方が発生しやすい or 復旧しがいがあるんですかねぇ。 たとえば、4バイトな wchar_t で処理しているプログラムが扱うデー タであれば、4バイト境界からずれることは考えにくいでしょう。 -- [田中 哲][たなか あきら][Tanaka Akira]