PHP

DOMDocument->loadHTML()でパースすると文字化けする

PHP

大体HTMLに原因があるのでそこを見ればよい。 原因1: CP932なのにmeta charset=Shift_JISになっている 原因2: meta charsetは正しいが、それより前にマルチバイト文字がある 原因3: そもそもmeta charsetがない ブラウザが「いい感じ」に処理してくれるのも…

cURL 7.56.0で大きなデータをPOSTするとデータが壊れる

curl_setopt()のCURLOPT_POSTFIELDSでデータを設定し送信するときに、16KBあたり以降のデータが先頭からの繰り返しになる。 PHP 7.1.11以降、最新のPHP 7.2.1でも起きる。 cURLのバグのようで、公式WindowsビルドのcURLがPHP 7.1.11から7.56.0にアップデート…

parse_url()の結果が壊れる

parse_url()で日本語URL(IRI状態)を渡すと壊れる。具体的には全角空白が別のUTF-8として無効な文字列になった。(PHP7.1)調べてみるとphp_replace_controlchars_ex()でiscntrl()を呼び出し、コントロール文字を'_'に置換している。 日本語のWindows環境ではAS…

touchしてもstat cacheはクリアされない

PHP

touch()を実行したらそのPHPプロセスにとってメタ情報が変わったことは明らかだ。なのでclearstatcache()しなくてもfilemtime()の値が新しくなると思い込んでいたのだが、実際はそうではない。 7.0b2のソースでもそのようなコードはない。 // ext/standard/f…

mb_convert_encoding()の警告

PHP

エンコーディング変換でfrom_encodingの候補が複数になってしまうことがある。 普通は送信側の仕様にencoding指定やI/Fのバージョンを導入してあいまいな状況を避けるのだが、受け側で対処しなければならないことがある。 ただ複数エンコーディングを指定し…

json_encodeとserializeの比較

PHP

データの受け渡しにJSONを使うかserializeを使うかは、大体相手や内容によって変わる。 外部アプリケーションに渡すならばJSONやXMLを使うし、PHPのオブジェクトを保存するならば基本的にserializeが便利だ。 しかし内部的に使うだけのデータを配列に入れて…

CentOS5でRemiのPHP5.4にupdateするとエラー

今時にel5かという声は無視して*1PHP5.4が降りてきたのでupdateしようとすると、php-eacceleratorでエラーが起きる。 1:php-eaccelerator-0.9.6.1-20.el5.remi.x86_64 from installed has depsolving problems --> Missing Dependency: php-common = 5.3.19 …