From: "NARUSE, Yui" Date: 2008-08-02T03:42:21+09:00 Subject: [ruby-dev:35727] Re: "\x01\x00\x00\x00\x00\x00\x00\x21".encode("utf-8", "utf-32be", :invalid=>:replace) 成瀬です。 Tanaka Akira wrote: > UTF-32BE で、文字として正しくない 4バイトと、文字として正し > い 4バイトがつながったものを > encode("utf-8", "utf-32be", :invalid=>:replace) で変換すると、 > 正しい文字 (以下の例では EXCLAMATION MARK) がなくなってしま > い、REPLACEMENT CHARACTER がふたつ出てきます。 > > % ./ruby -e 'p "\x01\x00\x00\x00\x00\x00\x00\x21".encode("utf-8", "utf-32be", :invalid=>:replace).force_encoding("ascii-8bit")' > "\xEF\xBF\xBD\x00\xEF\xBF\xBD" ./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 2. "\x00\x00\x00\x00" → NUL 3. "\x21" invalid → REPLACEMENT CHARACTER ってことなんでしょうね。 つまるところ、これは invalid をビット化けに最適化するか、 ビット落ちに最適化するかの話なのかなぁ。 どちらの方が発生しやすい or 復旧しがいがあるんですかねぇ。 -- NARUSE, Yui