##はじめに
HTMLメールや、一部のブラウザで「?」や「・」の文字が含まれてしまうことがあります。
それらの文字を、無害な空白文字に変換する処理をメモしておこうと思います。
※この記事ではUTF8をエンコードに用いる場合を前提としておきます。
参考にさせていただいた記事
https://qiita.com/plsplsme/items/59bbfe4be2ec96d07792
https://qiita.com/hollydad/items/9c0399146415af1912d8
##文字化けが発生する原因について
HTMLで空白を設定する際、** **を使って空白文字を挿入することがありますが、それらの空白文字をCKEditorなどのwisiwygエディタを使ったり、スクレイピングするような場合に発生することがあります。
つまり、HTMLの文字をUTF8に変換し、それを表示する場合に文字化けを起こすことがあるということです。
#### と同様の空白文字は、様々な種類がある。
ノーブレークスペース
https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%96%E3%83%AC%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9
U+00A0 NO-BREAK SPACE
U+180E MONGOLIAN VOWEL SEPARATOR
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2007 FIGURE SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+200B ZERO WIDTH SPACE
U+202F NARROW NO-BREAK SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+FEFF ZERO WIDTH NO-BREAK SPACE
##対応内容
UTF8で保存されている空白文字を半角スペースに変換する。
function removeSpecialSpace(&$str)
{
if (is_array($str)) {
foreach($str as $k => $v) {
removeSpecialSpace($str[$k]);
}
} else {
$specialSpace = array(
"\xC2\xA0",
"\xE1\xA0\x8E",
"\xE2\x80\x80",
"\xE2\x80\x81",
"\xE2\x80\x82",
"\xE2\x80\x83",
"\xE2\x80\x84",
"\xE2\x80\x85",
"\xE2\x80\x86",
"\xE2\x80\x87",
"\xE2\x80\x88",
"\xE2\x80\x89",
"\xE2\x80\x8A",
"\xE2\x80\x8B",
"\xE2\x80\xAF",
"\xE2\x81\x9F",
"\xEF\xBB\xBF",
);
$str = str_replace($specialSpace, " ", $str);
}
}
この処理を挟むことで、空白文字の変換が確認できました。
また、実際にこの処理を用いて、メルマガの送信時に「?」の文字化けが解消できたことを確認しました。