The HTML accept-charset attribute tells the browser which character encoding to use when submitting a form (today, this effectively means sending form data in UTF-8).
accept-charset は、<form> の送信時に「入力した文字を、どの文字コード(エンコーディング)でサーバーへ渡すか」を指定する属性です。フォームの送信は最終的にバイト列になりますが、その変換ルールを決めるのが accept-charset です。
ざっくり言うと、フォームの送信ボタンを押した瞬間に「文字をどの箱(文字コード)に入れて運ぶか」を決めるイメージです。箱がズレると、受け取った側で文字化けしやすくなります。
accept-charset="UTF-8" を使い、サーバー側もUTF-8で受け取る前提に揃えるのが安全です。meta charsetとは役割が違う<meta charset="UTF-8"> は「そのHTMLをブラウザがどう読むか」。accept-charset は「フォーム送信時にどう送るか」。似ているけれど別の役割です。ポイント:「ページを読む文字コード」と「フォームを送る文字コード」は別。混ざると原因調査が難しくなります。
フォームで入力した文字は、送信時にバイト列へ変換されます。文字コードは、その変換ルールです。
この「ルール」がズレると、受け取る側が間違ったルールで戻してしまい、文字化けします。accept-charset は、送る側のルールを明示するためのひとつの手段です。
昔は複数の文字コードを並べて「この中から選んで送ってね」という使い方もありました。しかし現代の仕様では、実質的にUTF-8を前提として扱うのが安全です。
似た言葉が多いので、ここを一度で整理します。
<meta charset="UTF-8">(HTMLの読み取り)Content-Type: ...; charset=UTF-8(HTTPレスポンス)meta charset と矛盾すると混乱の元です。<form accept-charset="UTF-8">(フォーム送信)名前が似ている Accept-Charset(HTTPリクエストヘッダー)もありますが、フォームの accept-charset とは別物として扱うのが安全です(現代の主要ブラウザは送らない前提で設計されがちです)。
文字化けは「どこか1箇所だけUTF-8」だと、別の場所でズレて事故りやすいです。実務では、次の統一セットが一番強いです。
<meta charset="UTF-8"> を入れてUTF-8にする。accept-charset="UTF-8" を付け、送信もUTF-8前提にする。utf8mb4)に揃える。ポイント:「送る側がUTF-8」でも「受け取る側がUTF-8として読む」とは限りません。原因切り分けは“送信”と“受信”を分けて考えると早いです。
まずはこれだけでOK、という最小形です。
HTML
<form action="/submit" method="post" accept-charset="UTF-8">
<label>
お名前
<input type="text" name="name" autocomplete="name">
</label>
<button type="submit">送信</button>
</form>
インデント(字下げ)は半角スペース4つに揃えています。
実務では「ページ側もUTF-8」をセットで入れておくのが事故りにくいです。
HTML
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>フォーム送信をUTF-8に揃える</title>
</head>
<body>
<form action="/submit" method="post" accept-charset="UTF-8">
<label>
メッセージ
<textarea name="message" rows="4"></textarea>
</label>
<button type="submit">送信</button>
</form>
</body>
</html>
フォームは「文字コード」だけでなく「どんな形式で送るか」も関係します。ここで迷うと、文字化けの調査が遠回りになります。
application/x-www-form-urlencoded(デフォルト)multipart/form-data(ファイル送信など)text/plain(ほぼ使わない)実務の結論:UTF-8 +(通常は)urlencoded /(ファイルなら)multipart が安定です。
accept-charset を付けたのに文字化けするcharset、アプリの内部文字列、DBの照合順序など、どこかでズレると文字化けします。UTF-8統一のチェックリストを作ると強いです。meta charset、Content-Type、accept-charset を混ぜると、どれが原因か分からなくなります。まず役割を分けて考えます。文字コードは表示だけの話に見えて、実はセキュリティにも関わります。代表例は「デコードの不一致」です。
結論:入力はUTF-8として受け、サーバー側で一度検証し、表示・保存前に適切にエスケープするのが基本です。
accept-charset は必ず書いた方がいいですか?UTF-8 Shift_JIS)は指定できますか?accept-charset を書いたのに文字化けしますmeta charset を入れれば accept-charset は不要ですか?meta charset はページの読み取り、accept-charset はフォーム送信です。ただし、現代はどちらもUTF-8に揃えるのが基本なので、結果として「両方UTF-8」になります。form.acceptCharset で確認できます。ただし動的に変える必要がある場面は少ないので、基本はHTMLでUTF-8に揃える運用が安定します。accept-charset を変えても改善しない