Crystal に String#scrub と String#valid_encoding? を追加

前に次のような記事を書きました。

tmtms.hatenablog.com

Ruby と異なり、エンコーディングを変換したり UTF-8 として正しいバイト列かどうかを判定する方法もありません。つらい。

これを解決するために Crystal に String#scrubString#valid_encoding? を追加するライブラリを作りました。

github.com

これを使えば、UTF-8 かどうか怪しい文字列データを扱う時に実行時エラーを回避することができます。

require "string-scrub"
line = File.open("/dev/urandom").gets.to_s
p line.valid_encoding?  # => false
p line.scrub('')  # => "\u{13}\u{7}u〓^\t〓3\u{15}〓〓\u{0}〓\u{e}〓〓\"〓^2w\e〓〓{\r\u{1d}〓\u{f})\u{f}-〓〓C\u{13}8〓U〓a〓Ye〓'〓f\u{3}〓\\〓Z\u{10}〓〓〓ϸ〓(〓〓〓\u{1c}e〓C`〓〓〓〓\u{1c}〓〓\n"