Slide 1

Slide 1 text

mb_convert_encodingと mb_convert_variablesのautoが 違う

Slide 2

Slide 2 text

自己紹介 てきめん ● https://tekitoh-memdhoi.info ● @youkidearitai ● https://www.youtube.com/use r/tekitohmrp ● https://www.nicovideo.jp/user /2957748 ● https://github.com/youkideari tai ● オレ

Slide 3

Slide 3 text

早速見ていきましょう https://3v4l.org/tadVr

Slide 4

Slide 4 text

違いますね ● 何ならエラーメッセージすら違いますね – mb_convert_variables(): Unable to detect encoding – mb_convert_encoding(): Unable to detect character encoding

Slide 5

Slide 5 text

mb_convert_encodingのマニュアル ● string を解釈するのに使われている 現在の文字 エンコーディング。 配列またはカンマ区切りの文字 列とすることで、 複数のエンコーディングを指定で きます。 この場合、正しいエンコーディングを mb_detect_encoding() と同じアルゴリズムで推 測します。 https://www.php.net/mb_convert_encoding

Slide 6

Slide 6 text

mb_convert_variablesのマニュアル ● from_encoding には配列またはカンマ区切りの文 字列を指定し、 from-coding からエンコーディング の検出を試みます。 from_encoding が省略された 場合、detect_order を使用します。 なんか説明が違う https://www.php.net/mb_convert_variables

Slide 7

Slide 7 text

よくわからないので、php-srcの奥深くへと入っていく ことにした

Slide 8

Slide 8 text

mb_convert_encodingでは ● $from_encodingに”auto”を指定した時、この関 数にやってくる – mb_detect_encodingと同じ関数を使っている

Slide 9

Slide 9 text

mb_convert_variablesでは ● 何やら違う自動判定が 始まった – マニュアルによると「エ ンコーディング検出の ために Array または Object の文字列を結 合します。」とある

Slide 10

Slide 10 text

とりあえず、違うことはわかりました ● なるべく”auto”は使わないでくださいね – 使ってる文字コードはわかるようにしておきましょう – というか、2023年現在新たに使う人がいるのだろうか? – となると既存システムだよね多分となる

Slide 11

Slide 11 text

もうちょっと深ぼっていく 何故かSJISに変換できている mb_detect_orderにSJISが載っていないのに https://3v4l.org/CtI1k

Slide 12

Slide 12 text

なんでこれに気がついたの ● Major overhaul of mbstring (part 33)にて気づく – PHP 8.2まででは(mb_detect_order関係なし に)mb_detect_encodingが一番近いエンコーディングを返 すようにしてた – PHP 8.3ではmb_detect_orderに沿ったリストに基づいて変 換されるようになる – なので、PHP 8.3にアップグレードしようとする未来の人々は気 をつけてね(一応UPGRADINGファイルにも記述してもらった)

Slide 13

Slide 13 text

もうちょい ● mbstring.strict_detectionオプションを1にする ことで、厳密な検出ができるようになる – どっちにしても使わないほうが良いです – 繰り返しますが、使っている文字コードはわかっているよ うにしましょう ● 今だったらほとんどUTF-8でいい(はず)

Slide 14

Slide 14 text

おわり ご清聴ありがとうございました