登録フォームで情報を登録、メール配信するシステムをPHPで作っているのですが、フランス語などのアクセント記号付文字を登録すると文字化けしてしまいます。出来れば登録処理の段階でアクセント無しの文字に自動的に置換するようにしたいのですが、コード上はどのように記述すればよいでしょうか?

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2006/11/07 00:05:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:tobeoscontinue No.1

回答回数220ベストアンサー獲得回数59

ポイント10pt

>文字化けしてしまいます。

文字コードとしてjis,sjis,euc-jpなどが使われていると思います。これらのコードにはアクセント文字はありませんので文字化けは避けられません。

utf-8にすることでアクセント文字を識別できるのですが。

function ascii_replace($message)
{
  $from = array("É","À","È","Ù","Â","Ê","Î","Ô","Û","Ë","Ï","Ü","Ç","Œ",
                "à","è","ù","â","ê","î","ô","û","ë","ï","ü","ç","œ");
  $to   = array("E","A","E","U","A","E","I","O","U","E","I","U","C","OE",
                "a","e","u","a","a","i","o","u","e","i","u","c","oe");
  return str_replace($from, $to, $message);
}

utf-8であればstr_replace()を使って$fromから$toのように置換できます。しかし$from,$toに記述しないアクセント文字は置換されませんし、utf-8であればアクセント文字は文字化けしませんので置換する必要が無いんですよねぇ。(^^)


function cut_accent_grave($message)
{
  preg_match_all("/[A-Za-z0-9\s]+/", $message, $match);
  return implode($match[0]);
}

逆に英数字以外削除してしまうのであれば簡単ですが、今度は漢字さえも削除してしまうのが難点です。どちらも使えませんねぇ。もっと対象を絞ってもらったらもう少しまともな対策がとれるかもしれません。

utf-8なら後々楽なんですけどね。

http://q.hatena.ne.jp/ ダミー

  • id:bonlife
    回答を開けさせていただきました。
    やはりこのように1文字ずつ置換するしかないようですね…。

    ちなみに、JavaでUnicodeを扱う場合、Normalizer.decomposeで文字を分解して、InCombiningDiacriticalMarksを削除する、というやり方でアクセントがついた文字をアクセントなしの文字列に変換できるようです。
    http://glaforge.free.fr/weblog/index.php?itemid=115

この質問への反応(ブックマークコメント)

トラックバック

  • 気負わない日記 2007-05-01 23:47:33
  • [php]PHPのiconv関数がすごすぎる件について 気負わない日記 2007-05-01 23:47:34
    UTF-8のデータを携帯サイトで表示しなければならなくなり試行錯誤の記録。 ご存知だと思うのですが携帯のサイトで利用できる文字コードはShift-JISになります。 そのようなわけでUTF-8 → SJI
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません