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

回答編集履歴

1

追記

2017/05/01 12:46

投稿

shi_ue
shi_ue

スコア4437

answer CHANGED
@@ -7,4 +7,32 @@
7
7
  何せ、`iso-2022-jp`にMicrosoftが独自拡張したものですから、Windows上で`iso-2022-jp`の文字コードのデータが来たら`iso-2022-jp-ms`として取り扱いますよね。
8
8
 
9
9
  ubuntu上のthunderbirdは`iso-2022-jp`といいながら、丸数字もちゃんと出ます。
10
- なので、大体のメーラーは`iso-2022-jp`ときたら、`iso-2022-jp-ms`と解釈しているんじゃないでしょうか?
10
+ なので、大体のメーラーは`iso-2022-jp`ときたら、`iso-2022-jp-ms`と解釈しているんじゃないでしょうか?
11
+
12
+ 追記
13
+ ---
14
+ 実験コードを書いてみました。
15
+ ```php
16
+ <?php
17
+ mb_language('ja');
18
+ mb_internal_encoding('UTF-8');
19
+
20
+ $text = '①②㈱髙アイウエオ';
21
+ $text = mb_convert_encoding($text, 'ISO-2022-JP-MS', 'UTF-8');
22
+
23
+ $body = "これがテストです\n\n$text"; // ※1
24
+
25
+ $output = mb_convert_encoding($body, 'ISO-2022-JP', 'UTF-8'); // ※2
26
+ echo mb_convert_encoding($output, 'UTF-8', 'ISO-2022-JP-MS'); // ※3
27
+ ```順を追います。
28
+ 0. ※1の部分では、UTF-8とISO-2022-JP-MSの混合文が出来ています。
29
+ 0. ※2の部分では、ISO-2022-JP-MSの部分($text変数の中身)はUTF-8ではないのでコンバートされません。
30
+ その他の部分がISO-2022-JPにコンバートされます。
31
+ 0. ※3の部分では、**ISO-2022-JPの部分**と**コンバートされなかったISO-2022-JP-MS部分**の両方がUTF-8へとコンバートされて出力されます。
32
+ メールだとこの表示される形式へのコンバートをメーラーがやるわけです。大抵のメーラーはISO-2022-JPをISO-2022-JPのMS拡張形式として処理しますので、ちゃんと表示されます。
33
+
34
+ したがって、メーラーだとちゃんと出力される、という訳です。
35
+ しかしながら、文字コードを混在のままコンバートさせていいのかどうか、悩むところです。
36
+ もし、ISO-2022-JP-MSに統一したとしても、`mb_send_mail`はUTF-8からISO-2022-JPへのコンバートをしようとしますので、そうれもどうなんでしょうか?
37
+
38
+ `mb_send_mail`の代わりに`mail`を使うのも手ですが、subjectを`mb_encode_mimeheader`する必要があるので面倒ですか?