4byteのUTF-8文字を置換する
mysqlはCHARSET=utf8
なVARCHAR型等のカラムでは3byteまでのUTF-8文字しか格納できず,4byte文字をINSERTしようとするとIncorrect string value
と言われてしまう.これはutf8mb4を指定することで回避できるが,最大長が255文字でかつインデックスを貼る必要があるとutf8を使わざるを得ないので(さらにユースケース的に4byte文字の中身とかどうでもよいので),4byteのUTF-8文字を下駄マーク(\x3013)に置換する.
$s =~ s/[\x{10000}-\x{3ffff}\x{40000}-\x{fffff}\x{100000}-\x{10ffff}]/\x{3013}/g;
置換後の文字は,そもそもUTF-8としてデコードできなかった文字と区別するために,\xfffdではなく\x3013(〓)にしている.
ref: http://perldoc.perl.org/perlunicode.html#Unicode-Encodings http://reishi42.blogspot.jp/2008/06/ufffd-replacement-character.html