Help us understand the problem. What is going on with this article?

HTMLメール等で文字化けする空白文字を無害な空白文字に変換する

More than 1 year has passed since last update.

はじめに

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);
    }
}

この処理を挟むことで、空白文字の変換が確認できました。
また、実際にこの処理を用いて、メルマガの送信時に「?」の文字化けが解消できたことを確認しました。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away