質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

7106閲覧

PHPでmb_encode_mimeheaderを使うと半角カタカナが文字化けする

kumakumatan

総合スコア213

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/09/29 09:30

編集2016/09/29 10:12

php-5.5.27
Windows2008R2

mb_send_mailにて本文、題名などに半角カタカナを利用すると、「????」となって
しまいます。

php

1$header = mb_convert_encoding($header, 'ISO-2022-JP-MS', 'UTF-8' ); 23$header = mb_convert_kana($header, "KV", "utf-8"); 4メール送信 5mb_send_mail ( $to,$sub,$msg,$header)

をしても「???」となってしまいます。
どのようにしたら対処できますでしょうか?

下記にソースコードを記載します。

php

1<?php 2 3setlocale(LC_CTYPE, 'Japanese_Japan.932'); //locale設定 4 5mb_language("Japanese"); 6mb_internal_encoding("SHIFT-JIS"); 7 8 9require_once ( 'xxx.inc.php' ); 10 11$mysqli = new mysqli(HOST_IP, USER_NAME, USER_PASSWORD, DB_NAME); 12 13 // SQLを実行します(ユーザ名・パスワード検索)。 14if (!$select = mysqli_query($mysqli, "SELECT * FROM db_user")) { 15 16header("Location:./ERROR/db-error.php"); 17 18 exit(); 19} 20 21 22//$result = mysqli_query($mysqli, "SELECT Address FROM mail"); 23//if (!$result) { 24// echo '只今、システムが利用できません。管理者にお問合せ下さい。'; 25// exit; 26//} 27 28// SQLの実行(SELECT) 29$sql = "SELECT * FROM mail where FLG = '0' or '1' "; 30if ($result = $mysqli->query($sql)) { 31 // 連想配列を取得 32 while ($row = $result->fetch_assoc()) { 33 // echo $row["Address"] . $row["JIGMEK"] . "<br>"; 34 //echo $row["Address"] . "<br>"; 35 $email[] = $row["Address"]; 36 $send = implode(",", $email); 37 38 } 39 // 結果セットを閉じる 40 $result->close(); 41} 42 43// SQLの実行(SELECT) 44$sql1 = "SELECT * FROM mail where FLG = '1'"; 45if ($result1 = $mysqli->query($sql1)) { 46 // 連想配列を取得 47 while ($row = $result->fetch_assoc()) { 48 // echo $row["Address"] . $row["JIGMEK"] . "<br>"; 49 //echo $row["Address"] . "<br>"; 50 $email2[] = $row["Address"]; 51 $sendkanri = $email2; 52 } 53 // 結果セットを閉じる 54 $result1->close(); 55} 56 57 58// SQLの実行(カウント) 59//echo "rows=" . mysqli_num_rows($result); 60//MySQL から切断 61// $mysqli->close(); 62 63//echo $send; 64 65 66//dateでフォーマットを指定して日付を取得 67//5.1.0からタイムゾーンを設定する必要がある。 68date_default_timezone_set('Asia/Tokyo'); 69$systemDate = date("Y/m/d/ H:i:s"); 70 71$send = $send ."," .$MAIL; 72 73 74$msg = "お疲れ様です。"; 75 76//////////0x5c対応////////// 77//エスケープ文字削除 78$FILENAME2 = stripcslashes($FILENAME2); 79//////////0x5c対応////////// 80 81 82 83//$array[] = "アップロードされました。"; 84//$array[] = ""; 85//$array[] = "テスト"; 86//$array[] = ""; 87//$array[] = "担当者"; 88$msg .= "\r\n"; 89$msg .= "\r\n"; 90$msg .= "アップロードされました。"; 91$msg .= "\r\n"; 92$msg .= "\r\n"; 93$msg .= " ■アップロード日付:$systemDate"; 94$msg .= "\r\n"; 95$msg .= "\r\n"; 96$msg .= " ■タイトル:$test"; 97$msg .= "\r\n"; 98//$msg .= "\r\n"; 99//$msg .= " ■会社名:$test1"; 100//$msg .= "\r\n"; 101$msg .= "\r\n"; 102$msg .= " ■送信者:$test2"; 103$msg .= "\r\n"; 104$msg .= "\r\n"; 105$msg .= " ■アップロードファイル名:$FILENAME2"; 106$msg .= "\r\n"; 107$msg .= "\r\n"; 108$msg .= " ■ダウンロード先:テストURL"; 109$msg .= "\r\n"; 110$msg .= "\r\n"; 111$msg .= "\r\n"; 112$msg .= "\r\n"; 113$msg .= "ご確認をお願いします。"; 114 115$to = "$send"; 116$sub = "資料【" .$test ."】アップロード完了"; 117 118 119$header = "From: " .mb_encode_mimeheader("テスト") ."<test@xx.dxxx.xx.jp>"; 120 121$header.= "\n"; 122$header.= "Bcc:xxxx@xx.xxx.xx.xx"; 123 124 125// 件名をJISに変換 126$sub = mb_convert_encoding($sub,"SHIFT-JIS"); 127// 本文をJISに変換 128//$header = mb_convert_encoding($header,"SHIFT-JIS"); 129$header = mb_convert_encoding($header, 'ISO-2022-JP-MS', 'SHIFT-JIS' ); 130//$header = mb_convert_kana($header, "KV", "SHIFT-JIS"); 131 132 133if (!$mailsend = mb_send_mail ( $to,$sub,$msg,$header)){ 134 135 $query = "INSERT INTO mail_log(date, test, test2, test3, test4, test5) values('$systemDate', '$test2', '$test3', '$test4', '$test5', 'NG')"; 136 $result = $mysqli -> query($query); 137 $mysqli->close(); 138 139 }else{ 140 141 $query = "INSERT INTO mail_log(date, test, test2, test3, test4, test5) values('$systemDate', '$test2', '$test3', '$test4', '$test5', 'OK')"; 142 $result = $mysqli -> query($query); 143 $mysqli->close(); 144 145 } 146 147?>

お時間のある時、ご教授をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PHP

1$header = mb_convert_encoding($header, 'ISO-2022-JP-MS', 'UTF-8' ); 2```こちらは`ISO-2022-JP-MS`ですし、半角は半角のままになりますね。 3```PHP 4$header = mb_convert_kana($header, "KV", "utf-8"); 5```こちらはUTF-8ですよ? 6文字コードがバラバラですから、どうなっているのかわかりません。 7本当にinternal encodingはUTF-8ですか? 8 9どういう流れで使っているのか分からないので、何とも言えないです。 10コードを切り出す際は、実際に症状が出ている状態で最小のコードを作っていただくと回答しやすいです。 11 12追記 13-- 14やっぱり実際のコードとは違いましたね。 15```PHP 16$header = "From: " .mb_encode_mimeheader("テスト") ."<test@xx.dxxx.xx.jp>"; 17```ここで`mb_encode_mimeheader`に入れている「テスト」が実は半角なんですね? 18`mb_encode_mimeheader`はinternal encodingのSJISでmimeエンコードされてしまいます。 19 20```PHP 21$header = "From: " .mb_encode_mimeheader("テスト", 'ISO-2022-JP-MS') ."<test@xx.dxxx.xx.jp>"; 22```としてみてはどうでしょうか? 23 24あと、奇妙に思うのは、全体的にSJISで文字コードを統一しておられると思います。 25ですので、subjectや本文は文字コードのコンバートがいらないと思います。`mb_send_mail`が勝手に、SJISからISO-2022-JPに変換します。 26 27さらに追記 28-- 29Wikipedia ISO-2022-JP より 30> また、符号化方式名をISO-2022-JPとしているのに、文字集合としてはJIS X 0212(補助漢字)やJIS X 0201の片仮名文字集合(いわゆる半角カナ)をも符号化している例があるが、**ISO-2022-JPではこれらの文字を許容していない。**これらの符号化は独自拡張の実装であり、中にはISO/IEC 2022の仕様に準拠すらしていないものもある。従って受信側の電子メールクライアントがこれらの独自拡張に対応していない場合、その文字あるいはその文字を含む行、時にはテキスト全体が文字化けすることがある。 31 32となっていますので、mbstringが半角カナをうまくISO-2022-JPにコンバートできなくても、しょうがないような気がします。(mb_send_mailはISO-2022-JPにコンバートします。MS独自拡張ではありません) 33どうしても、半角カナが送れないと嫌だ、という場合は、`ISO-2022-JP-MS`にすべてコンバートした上で、`mail`で送ればいいと思いますよ。 34 35また、 36```PHP 37$msg = mb_convert_kana($msg, "KV", "SHIFT-JIS"); 38```とやって、半角カナから全角カナにコンバートしてやっても化けるとなると、おかしなことですね。 39提供されているコードではそのようにしているところがありませんでした。 40(やろうとしているのは`$header`に対してです。コメントアウトされてますけど)

投稿2016/09/29 09:55

編集2016/09/29 15:23
shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2016/09/29 10:13

コードを作成して、質問画面にアップロードしました。 お時間のあるときご教授をお願いします。
kumakumatan

2016/09/29 10:52

ご回答ありがとうございます。 実際は本文の文字(変数)に半角カナだと文字(?)になってしまいます。
kumakumatan

2016/09/30 01:51

ご回答ありがとうございます。半角カナを全角カナに変換する事で解決しました。 //半角カナを全角カナに変換する $TEST = mb_convert_kana($TEST, 'K'); $TEST2 = mb_convert_kana($TEST2, 'K'); で対応できました。 ありがとうございました。
guest

0

PHPでJIS以外の文字を文字化けせずに日本語メールを送る方法
いわゆる半角カナや種依存文字などをメールで送信する方法
あたりが使えるのでは?

ちょっと古い話ですが、UNIX系では半角カタカナは文字化けし易いので全角に変換して使うことが多かったようで、半角カタカナも全角カタカナも1文字3バイト使うので容量を節約できるメリットもなくなったので、半角カタカナは使わない、使っても勝手に全角変換するってユーザーもあります。

投稿2016/09/29 09:52

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問