前に次のような記事を書きました。
Ruby と異なり、エンコーディングを変換したり UTF-8 として正しいバイト列かどうかを判定する方法もありません。つらい。
これを解決するために Crystal に String#scrub
と String#valid_encoding?
を追加するライブラリを作りました。
これを使えば、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"