4byteのUTF-8文字を置換する

mysqlCHARSET=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