EUC-JPフォームの文字化け
開発中、文字化けに出くわしました。
以下のようなシンプルなフォーム(POST情報が少ない)でのみ再現します。
このフォームに「属性」をいれて送信すると、PHP側の出力で
string is °
と、「属性」をEUC-JPと認識せず文字化けを起こしました。
「属性」をEUC-JP文字コードで調べたところ、
C2 B0 C0 AD
となります。
またSHIFT-JISのコード範囲は、
1バイト目 : 0x81 - 0x9F または 0xE0 - 0xFC
2バイト目 : 0x40 - 0x7E または 0x80 - 0xFC
となっており、2バイト目にSHIFT-JISのコードの条件があてはまっているのがわかります。
これが文字化けを起こしていた原因でした。
そして、対策方法ですが、hiddenを利用します。
valueに入っている「美乳」、これがポイントです。
これも同じように16進数に変換すると、
C8 FE C6 FD
となり、1バイト目、2バイト目共に、SHIFT-JISコードに当てはまらないので、POST時に確実にEUC-JPと認識させ、文字化けを解消できました。
以下のようなシンプルなフォーム(POST情報が少ない)でのみ再現します。
<html lang="ja">
<head>
<meta http-equiv=Content-Type content="text/html; charset=EUC-JP">
</head>
<body>
<table>
<form name="form1" action="test.php" method="POST">
<tr>
<td>文字を入力してください</td>
<td><input type="text" name="string"></td>
<td><input type="submit" value="送信"></td>
</tr>
</form>
</table>
<?php
if(isset($_POST['string'])) {
print("string is " . $_POST['string']);
}
?>
</body>
</html>
このフォームに「属性」をいれて送信すると、PHP側の出力で
string is °
と、「属性」をEUC-JPと認識せず文字化けを起こしました。
「属性」をEUC-JP文字コードで調べたところ、
C2 B0 C0 AD
となります。
またSHIFT-JISのコード範囲は、
1バイト目 : 0x81 - 0x9F または 0xE0 - 0xFC
2バイト目 : 0x40 - 0x7E または 0x80 - 0xFC
となっており、2バイト目にSHIFT-JISのコードの条件があてはまっているのがわかります。
これが文字化けを起こしていた原因でした。
そして、対策方法ですが、hiddenを利用します。
<input type="hidden" name="dummy" value="美乳">
valueに入っている「美乳」、これがポイントです。
これも同じように16進数に変換すると、
C8 FE C6 FD
となり、1バイト目、2バイト目共に、SHIFT-JISコードに当てはまらないので、POST時に確実にEUC-JPと認識させ、文字化けを解消できました。

