mb_encode_mimeheader()のマニュアルを直してもらいました
mb_encode_mimeheader(mb_convert_encoding($str, 'iso-2022-jp'))
とかいう迷信の話です。
- mb_encode_mimeheaderの都市伝説を検証する - CPA-LABテクニカル
- mb_encode_mimeheader()の文字化けについて [メモとかメモのようなものとか(By ルーキーの中のひと)]
マニュアルの記述を追っかけてみると、そもそも英語版からして
charset specifies the name of the character set in which str is represented in. The default value is determined by the current NLS setting (mbstring.language). mb_internal_encoding should be set to same encoding.
r331340 - /phpdoc/en/trunk/reference/mbstring/functions/mb-encode-mimeheader.xml
なんて書き方なので、色々勘違いするだろうと。日本語版では「charsetは、strの文字セット名です」なんて訳され、英語版でもプロトタイプ宣言にデフォルト引数を書く際に $charset = mb_internal_encoding()
なんて書かれているわけで。
バッドノウハウとか言われてるのも変な話ですし、何より自分がマニュアル見て混乱するので、バグ報告することにしました*1。
バグを投げつける報告する
https://bugs.php.net/ に書くわけですが、まず既に似たようなバグが報告されていないか検索しましょう。右上の検索ボックスからでは未解決のバグしか検索できないので、advanced searchからStatus:Allとして検索します。Type:Documentation Problemとしてもいいですね。
マニュアルに関するバグは、マニュアルの各ページ右上の言語セレクタの下にある「Report a bug」から報告できます。
クリックするとbugs.php.netのフォームに飛ばされるので、以下を適当に埋めます。
- メールアドレス、編集パスワード
- PHP version: 適当なのを選択するか、特にバージョン関係ない話なら Irrelevant を選択
- Package affected: 関連するコンポーネント、もしくは Documentation problem とか Translation problem とか。
- タイトル、本文
実際どんな感じで報告されているのかは、最近報告された未解決の質問を参考に。
で、こちら。
PHP :: Doc Bug #71357 :: mb_encode_mimeheader(): confusing description of $charset
今回は日本語使える方にフォローしてもらったほうが冒頭の記事なんかも紹介できてわかりやすいかなと思い、コミッタである @takagi さんにリプライを飛ばしたところ、速攻で対応してもらえました。ありがとうございます。
ユーザー会のML?そもそもユーザー会のサイトが落ちて(ry
まとめ
バグ報告しよう。コミッタを頼ろう。
あと Report a bug の隣に Edit ってリンクがありますが、そこからオンラインエディタに飛べます。匿名ユーザーもパッチを投げれます。細かい修正や訳の追加はこれだけでもいいかも。
mb_internal_encoding('UTF-8'); // UTF-8じゃないなら変える mb_language('ja'); // 折り返しは To: とか Subject: とかも含めて計算されるべきなので // 本当は $str にその辺も含めるか、$indentを指定した方がよい echo mb_encode_mimeheader($str);
*1:でもこの記述、7年前から存在してる割にbugsで話題にはなっていないという。mb_internal_encoding() の設定が徹底されていて気づかなかったのか、バッドノウハウ()でしのげるからどうでもよかったのか。今更直す必要もなかったんだろうか。