teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2016/09/29 15:23

投稿

shi_ue
shi_ue

スコア4437

answer CHANGED
@@ -23,4 +23,19 @@
23
23
  ```としてみてはどうでしょうか?
24
24
 
25
25
  あと、奇妙に思うのは、全体的にSJISで文字コードを統一しておられると思います。
26
- ですので、subjectや本文は文字コードのコンバートがいらないと思います。`mb_send_mail`が勝手に、SJISからISO-2022-JPに変換します。
26
+ ですので、subjectや本文は文字コードのコンバートがいらないと思います。`mb_send_mail`が勝手に、SJISからISO-2022-JPに変換します。
27
+
28
+ さらに追記
29
+ --
30
+ Wikipedia ISO-2022-JP より
31
+ > また、符号化方式名をISO-2022-JPとしているのに、文字集合としてはJIS X 0212(補助漢字)やJIS X 0201の片仮名文字集合(いわゆる半角カナ)をも符号化している例があるが、**ISO-2022-JPではこれらの文字を許容していない。**これらの符号化は独自拡張の実装であり、中にはISO/IEC 2022の仕様に準拠すらしていないものもある。従って受信側の電子メールクライアントがこれらの独自拡張に対応していない場合、その文字あるいはその文字を含む行、時にはテキスト全体が文字化けすることがある。
32
+
33
+ となっていますので、mbstringが半角カナをうまくISO-2022-JPにコンバートできなくても、しょうがないような気がします。(mb_send_mailはISO-2022-JPにコンバートします。MS独自拡張ではありません)
34
+ どうしても、半角カナが送れないと嫌だ、という場合は、`ISO-2022-JP-MS`にすべてコンバートした上で、`mail`で送ればいいと思いますよ。
35
+
36
+ また、
37
+ ```PHP
38
+ $msg = mb_convert_kana($msg, "KV", "SHIFT-JIS");
39
+ ```とやって、半角カナから全角カナにコンバートしてやっても化けるとなると、おかしなことですね。
40
+ 提供されているコードではそのようにしているところがありませんでした。
41
+ (やろうとしているのは`$header`に対してです。コメントアウトされてますけど)

2

追記

2016/09/29 15:23

投稿

shi_ue
shi_ue

スコア4437

answer CHANGED
@@ -20,4 +20,7 @@
20
20
 
21
21
  ```PHP
22
22
  $header = "From: " .mb_encode_mimeheader("テスト", 'ISO-2022-JP-MS') ."<test@xx.dxxx.xx.jp>";
23
- ```としてみてはどうでしょうか?
23
+ ```としてみてはどうでしょうか?
24
+
25
+ あと、奇妙に思うのは、全体的にSJISで文字コードを統一しておられると思います。
26
+ ですので、subjectや本文は文字コードのコンバートがいらないと思います。`mb_send_mail`が勝手に、SJISからISO-2022-JPに変換します。

1

追記

2016/09/29 10:37

投稿

shi_ue
shi_ue

スコア4437

answer CHANGED
@@ -8,4 +8,16 @@
8
8
  本当にinternal encodingはUTF-8ですか?
9
9
 
10
10
  どういう流れで使っているのか分からないので、何とも言えないです。
11
- コードを切り出す際は、実際に症状が出ている状態で最小のコードを作っていただくと回答しやすいです。
11
+ コードを切り出す際は、実際に症状が出ている状態で最小のコードを作っていただくと回答しやすいです。
12
+
13
+ 追記
14
+ --
15
+ やっぱり実際のコードとは違いましたね。
16
+ ```PHP
17
+ $header = "From: " .mb_encode_mimeheader("テスト") ."<test@xx.dxxx.xx.jp>";
18
+ ```ここで`mb_encode_mimeheader`に入れている「テスト」が実は半角なんですね?
19
+ `mb_encode_mimeheader`はinternal encodingのSJISでmimeエンコードされてしまいます。
20
+
21
+ ```PHP
22
+ $header = "From: " .mb_encode_mimeheader("テスト", 'ISO-2022-JP-MS') ."<test@xx.dxxx.xx.jp>";
23
+ ```としてみてはどうでしょうか?