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

質問編集履歴

5

追記3を追加

2016/10/18 10:43

投稿

chibi_kuma
chibi_kuma

スコア85

title CHANGED
File without changes
body CHANGED
@@ -266,7 +266,7 @@
266
266
 
267
267
  以下のページで紹介されていますが、
268
268
  [PHPで外字を含む文字列のエンコードコンバート](https://cloudpack.media/761)
269
- > しかし、PHP V5.2.1以降では『iso-2022-jp-ms』というエンコーディングが追加され、
269
+ > PHP V5.2.1以降では『iso-2022-jp-ms』というエンコーディングが追加され、
270
270
  このエンコーディングでサポートされている文字も変換する事が可能になりました。
271
271
  $str = mb_convert_encoding( $str, 'ISO-2022-JP-MS');
272
272
  これにより、$strに(サポートされている)外字が含まれていても、正常にコンバートすることが出来ます。
@@ -283,9 +283,6 @@
283
283
  問題なく表示されました。(さすが…)
284
284
 
285
285
 
286
- 引き続き、ご指導お願い申し上げます。
287
-
288
-
289
286
  追記2
290
287
  ---
291
288
 
@@ -312,10 +309,9 @@
312
309
  サーバ証明書が切り替わりますので、
313
310
  「SHA-2」方式および「TLS1.0以上」に対応していない携帯端末
314
311
  (2008年位より前に発売されたガラケー)は、サポート外にしようと思っていますが、
315
- 「SHA-2」方式および「TLS1.0以上」に対応している機種で、
316
- 「ISO-2022-JP-MS」がサポートされていない機種って、まだまだあるものなのでしょうか?
312
+ 対応している機種で「ISO-2022-JP-MS」がサポートされていない機種って、
317
- (どうやって調べるんですか…こういうの…)
313
+ あるものなのでしょうか?(どうやって調べるんですか…こういうの…)
318
- 何か情報をお持ちでしたら、御知らせいただければ幸いです。
314
+ 情報をお持ちでしたら、御知らせいただければ幸いです。
319
315
 
320
316
 
321
317
  UTF-8の文字で、ISO-2022-JP-MSに含まれていない文字への対策
@@ -327,4 +323,67 @@
327
323
  mb_substitute_character('entity');
328
324
  ```
329
325
 
326
+
327
+ 追記3
328
+ ---
329
+ imutakaoruさんからいただいたコードを、実行させてみました。
330
+ 無事、UTF-8のままで送れました!!
331
+ (imutakaoruさん、ありがとうございます!)
332
+
333
+ 受信したメールのヘッダーを確認したところ、
334
+ となっており、Gmailに近づいた気がします。(自分の理想に近い)
335
+
330
- 取り急ぎ、ご報告まで。
336
+ ```ここに言語を入力
337
+ MIME-Version: 1.0
338
+ Content-Type: text/plain; charset=UTF-8
339
+ Content-Transfer-Encoding: BASE64
340
+
341
+ ```
342
+
343
+ UTF-8をフルカバーできるか?
344
+ ---
345
+ ISO-2022-JP-MS に変換しないので、ISO-2022-JP-MS に含まれていない文字が本文に入っていたら
346
+ どうなるかと思い、以下のサイトで紹介されていた二字を足してみました。
347
+
348
+ [マルチバイト文字を扱う際に気をつけること](http://qiita.com/mpyw/items/a8dba1b80fe68523b8eb)
349
+ (U+29E3Dの「=ホッケ」と U+50AA「=さん」)
350
+
351
+ この2字がUTF-8かどうか、よく分かりませんが、
352
+ 一応、UTF-8のファイルではちゃんと書けています。
353
+
354
+ $message = 'これはテストです コレハテストデス 神と神 ①②③ 髙﨑黑神福 ㈱ Ⅰ Ⅱ Ⅲ ???? 傪';
355
+
356
+ これを、imutakaoruさんからいただいたコードで送信した結果は、以下の通りでした。
357
+
358
+ iPhone OK
359
+ HUAWEI P8lite 「????」が文字化け
360
+ AL-Mail ???? 傪 とも文字化け
361
+
362
+ ![イメージ説明](131430c193da5bd1ff274f7c5ef19728.jpeg)
363
+
364
+ ![(画像添付)](6b1fff535325545e317341bb573d10cf.jpeg)
365
+
366
+
367
+ HUAWEI P8liteは フォントが省略されているのではないかと思います。
368
+
369
+ 「Al-Mail」で受信したメールを外部エディタで確認してみると、
370
+ 本文はちゃんとBASE64でエンコードされていました。
371
+ 別のサイトで同じ文字列をBASE64エンコードして比較したところ、
372
+ 合致しましたので、エンコードの問題ではなさそうです。
373
+
374
+ Gmailからも同じ文字列を、Al-Mail宛に送ってみましたが、
375
+ やっはり同じように、最後の2字が化けました。
376
+ Al-Mailの問題か、フォントの問題かなと思います。
377
+
378
+ Al-Mailは古すぎるので、もうサポート外で良いのですが、
379
+ HUAWEI P8liteは、表示して欲しかったなぁ…。
380
+
381
+ 先ほど引用させていただいた、この一言に尽きるわけですね…。
382
+
383
+ > 文字エンコードを正しくコンバート出来る事と、
384
+ > 端末で外字を表示出来る事はイコールではありません。
385
+
386
+ UTF-8の全ての文字をサポートしようと思うと、
387
+ 難しそうなので、(端末側のフォント事情になると、もうどうしようもない。)
388
+ サポート文字範囲は、「ISO-2022-JP-MS」に含まれている文字まで、
389
+ それ以外はエンティティするか、ゲタ文字に置き換える、という仕様の方が安心できそうです。

4

追記2を追加

2016/10/18 10:43

投稿

chibi_kuma
chibi_kuma

スコア85

title CHANGED
File without changes
body CHANGED
@@ -283,4 +283,48 @@
283
283
  問題なく表示されました。(さすが…)
284
284
 
285
285
 
286
- 引き続き、ご指導お願い申し上げます。
286
+ 引き続き、ご指導お願い申し上げます。
287
+
288
+
289
+ 追記2
290
+ ---
291
+
292
+ HUAWEI P8lite のみ、ヘッダー情報がメール本文内になだれ込んでいる件、
293
+ 原因は、この行でした。
294
+
295
+ HUAWEI P8liteに届いたメールだけ、何故かメールの送信時間が
296
+ 「1970年1月1日」になっていたので、ヘッダーが壊れてるなと…。
297
+
298
+ ```PHP
299
+ $headers = 'From: XXXX@XXXX.XXX' . "\r\n"; //修正前
300
+ $headers = 'From: XXXX@XXXX.XXX' . "\n"; //修正後
301
+ ```
302
+
303
+ これでとりあえず、手持ちの端末では全てOKになりました!(ありがとうございます!)
304
+ 自宅に戻らないと確認できませんが、Mac、古いガラケーなども確認したいと思います。
305
+
306
+
307
+ PHPからISO-2022-JP-MS でメールを送信されている方へ追加でお尋ね
308
+ ---
309
+ ガラケーなど「ISO-2022-JP-MS」がサポートされていない端末も当然あるのではと
310
+ 気になっています。
311
+
312
+ サーバ証明書が切り替わりますので、
313
+ 「SHA-2」方式および「TLS1.0以上」に対応していない携帯端末
314
+ (2008年位より前に発売されたガラケー)は、サポート外にしようと思っていますが、
315
+ 「SHA-2」方式および「TLS1.0以上」に対応している機種で、
316
+ 「ISO-2022-JP-MS」がサポートされていない機種って、まだまだあるものなのでしょうか?
317
+ (どうやって調べるんですかね…こういうの…)
318
+ 何か情報をお持ちでしたら、御知らせいただければ幸いです。
319
+
320
+
321
+ UTF-8の文字で、ISO-2022-JP-MSに含まれていない文字への対策
322
+ ---
323
+ UTF-8の文字で、ISO-2022-JP-MSに含まれていない文字が入っていた場合にやはり化けるので、
324
+ 以下の一行を追加しました。
325
+
326
+ ```PHP
327
+ mb_substitute_character('entity');
328
+ ```
329
+
330
+ 取り急ぎ、ご報告まで。

3

追記を追加

2016/10/18 08:20

投稿

chibi_kuma
chibi_kuma

スコア85

title CHANGED
File without changes
body CHANGED
@@ -43,7 +43,7 @@
43
43
  コメントアウトになっています。
44
44
 
45
45
 
46
- ```PHP5.6
46
+ ```PHP
47
47
  <?php
48
48
  //mb_language() を使ってエンコー ディング方式を ISO-2022-JP/Base64 に設定。
49
49
  //この設定は、mb_encode_mimeheader() 関数で使用されます。
@@ -186,10 +186,101 @@
186
186
  return $encorded;
187
187
  }
188
188
 
189
-
190
- コード
191
189
  ```
192
190
 
193
191
  文字化け時のスマホのスクショを追加します。
194
192
 
195
- ![イメージ説明](d89c71d562613b826d9b23749dc75234.jpeg)
193
+ ![イメージ説明](d89c71d562613b826d9b23749dc75234.jpeg)
194
+
195
+ 追記
196
+ ---
197
+ 皆さん、たくさんご回答いただき、ありがとうございます。
198
+ こちらでまとめてお返事させていただく失礼をお許しください。
199
+
200
+ 参考にしたサイトが「添付を付ける例」だったので、
201
+ ちょっと小難しく考えすぎたのかと思いまして、
202
+ プログラムをシンプルなものにして、再検証してみました。
203
+
204
+ ```PHP
205
+
206
+ <?php
207
+ mb_language("Japanese");
208
+ mb_internal_encoding("UTF-8");
209
+ $to = 'XXX@XXXX.XXX';
210
+ $subject = 'これはテストプログラムから送信したメール!';
211
+ $message = 'これはテストです コレハテストデス 神と神 ①②③ 髙﨑黑神福 ㈱ Ⅰ Ⅱ Ⅲ';
212
+ $message = mb_convert_encoding($message, 'ISO-2022-JP-MS');
213
+ $headers = 'From: XXXX@XXXX.XXX' . "\r\n";
214
+
215
+ mb_send_mail ($to, $subject, $message, $headers);
216
+ ```
217
+
218
+ mailではなく、mb_send_mail にしました。
219
+
220
+ ちなみに、mb_get_info()の結果は以下の通りです。
221
+
222
+ ```
223
+ ------------------------------------------------------------------------
224
+ mb_get_info()の出力結果(カゴヤ・ジャパン レンタルサーバー)
225
+ ------------------------------------------------------------------------
226
+ Array
227
+ (
228
+ [internal_encoding] => UTF-8
229
+ [http_input] => UTF-8
230
+ [http_output] => UTF-8
231
+ [http_output_conv_mimetypes] => ^(text/|application/xhtml\+xml)
232
+ [func_overload] => 0
233
+ [func_overload_list] => no overload
234
+ [mail_charset] => ISO-2022-JP
235
+ [mail_header_encoding] => BASE64
236
+ [mail_body_encoding] => 7bit
237
+ [illegal_chars] => 0
238
+ [encoding_translation] => On
239
+ [language] => Japanese
240
+ [detect_order] => Array
241
+ (
242
+ [0] => ASCII
243
+ [1] => JIS
244
+ [2] => UTF-8
245
+ [3] => EUC-JP
246
+ [4] => SJIS
247
+ )
248
+ [substitute_character] => 63
249
+ [strict_detection] => Off
250
+ )
251
+ ```
252
+
253
+
254
+ エンコードせずにmb_send_mailした場合
255
+ ---
256
+ 全環境で、外字が?に化けました。
257
+
258
+ ISO-2022-JP-MS にエンコードしてmb_send_mailした場合
259
+ ---
260
+ iPhone OK
261
+ Windows LiveMail OK
262
+ AL-Mail OK
263
+ Gmail OK
264
+ Android(HUAWEI P8lite) NG
265
+ となりました。惜しい。
266
+
267
+ 以下のページで紹介されていますが、
268
+ [PHPで外字を含む文字列のエンコードコンバート](https://cloudpack.media/761)
269
+ > しかし、PHP V5.2.1以降では『iso-2022-jp-ms』というエンコーディングが追加され、
270
+ このエンコーディングでサポートされている文字も変換する事が可能になりました。
271
+ $str = mb_convert_encoding( $str, 'ISO-2022-JP-MS');
272
+ これにより、$strに(サポートされている)外字が含まれていても、正常にコンバートすることが出来ます。
273
+ 但し、文字エンコードを正しくコンバート出来る事と、端末で外字を表示出来る事はイコールではありません。いくら正常にコンバートしても、表示先の端末にその外字がサポートされていなければ表示されません。
274
+
275
+ HUAWEI P8lite は、iso-2022-jp-ms を表示できないのかも知れません。
276
+ 以下の添付を参照していただきたいのですが、ISO-2022-JP-MS でコンバートして送っているけど、
277
+ ヘッダーのcharsetには、ISO-2022-JP と書かれています。
278
+
279
+ ![イメージ説明](1ac3a4402524bd89fd37cdb3451313a1.jpeg)
280
+
281
+ 試しに、GmailからHUAWEI P8liteに送ってみると…
282
+ ---
283
+ 問題なく表示されました。(さすが…)
284
+
285
+
286
+ 引き続き、ご指導お願い申し上げます。

2

スクリーンショットを追加

2016/10/18 06:40

投稿

chibi_kuma
chibi_kuma

スコア85

title CHANGED
File without changes
body CHANGED
@@ -188,4 +188,8 @@
188
188
 
189
189
 
190
190
  コード
191
- ```
191
+ ```
192
+
193
+ 文字化け時のスマホのスクショを追加します。
194
+
195
+ ![イメージ説明](d89c71d562613b826d9b23749dc75234.jpeg)

1

タグに「メール」を追加

2016/10/18 04:27

投稿

chibi_kuma
chibi_kuma

スコア85

title CHANGED
File without changes
body CHANGED
File without changes