QA@IT
«回答へ戻る

回答を投稿

Ruby 2.1.0 で String#encode はエンコーディングを1つだけ指定すればすむようになり、String#scrub が追加されました。

str.encode('UTF-8', :invalid => :replace, :undef => :replace, :replace => '?')
str.scrub
str.scrub("*")
str.scrub{ |b| "*" }

導入の経緯については次の URL から確認できます。

Feature #6752 Replacing ill-formed subsequencce
http://bugs.ruby-lang.org/issues/6752

ほかには chars メソッドもしくはエイリアスの each_char メソッドを使って Enumerator オブジェクトに変換する方法もあります。

str.chars.collect { |c| (c.valid_encoding?) ? c : "\uFFFD" }.join
str.each_char.map { |c| (c.valid_encoding?) ? c : "\uFFFD" }.join

動作検証のために、Mac OSX で rbenv を使って Ruby 2.1.0 の開発版をインストールする際に homebrew を使ってインストールした autoconf のパスを追加する必要がありました。Sam Ruby のブログにくわしい解説があります。

export PATH=/usr/local/opt/autoconf/bin:$PATH
Ruby 2.1.0 で String#encode はエンコーディングを1つだけ指定すればすむようになり、String#scrub が追加されました。

```ruby
str.encode('UTF-8', :invalid => :replace, :undef => :replace, :replace => '?')
str.scrub
str.scrub("*")
str.scrub{ |b| "*" }
```

導入の経緯については次の URL から確認できます。

Feature #6752 Replacing ill-formed subsequencce
http://bugs.ruby-lang.org/issues/6752

ほかには chars メソッドもしくはエイリアスの each_char メソッドを使って Enumerator オブジェクトに変換する方法もあります。

```ruby
str.chars.collect { |c| (c.valid_encoding?) ? c : "\uFFFD" }.join
str.each_char.map { |c| (c.valid_encoding?) ? c : "\uFFFD" }.join
```

動作検証のために、Mac OSX で rbenv を使って Ruby 2.1.0 の開発版をインストールする際に homebrew  を使ってインストールした autoconf のパスを追加する必要がありました。Sam Ruby のブログにくわしい[解説](http://www.intertwingly.net/blog/2013/03/21/rbenv-first-impressions)があります。

```bash
export PATH=/usr/local/opt/autoconf/bin:$PATH
```