Linuxのデスクトップとサーバーについて扱います。前置きWebページのPHPコードをUbuntuで書いているのですが、テスト環境としてxamppでも動かすことになりました。開発をスムーズに進めるために、Linuxとxamppで同一ソースを使える必要があります。XAMPPで書き出し、読み込みの両方で文字化けが発生していることがわかるxampp環境は、Ubuntuよりも前衛的というか、Ubuntu環境がスルーする非推奨な関数などに対して敏感なようです。Ubuntu環境では問題ないPHPコードでも、エラーメッセージを出してくれます。(面倒ではありますが)ソースコードから非推奨な関数や書き方を取り除く良い機会だとも思ったので、エラーメッセージに対してひとつずつソース修正を行うことにしました。デバックするコツは、検索ワードを「エラーメッセージ+エラーを起こした関数名」にすることかなと思います。問題は、解決法がWeb上にありました。検索すればこれぞというページが出てくるので楽でした。ところが、「日本語ファイル名の取り扱い」で、突然立ち往生することになりました。xammp環境でPHPを使ってファイルを読み書きすると、ファイル名が文字化けします。この現象について書かれたページを探したのですが、見つけた対処法がどれも効きません。・「php.iniを書き換える」という対処法があるのですが、自分の環境では上手く行きませんでした。できれば変更はプロジェクトディレクトリの中で完結させて(バージョン管理システムで管理できるから)、環境設定はできるだけデフォルトから変更せずに済むほうが良いです。・解決法の中には「出力をSJISにします」というものもありました。PHPの内部エンコーディングはUTF-8が基本であり、UTF-8とSJISをソース内で混在させたら、それこそ私の手に負えない複雑なコードになりそうです。それを避けようと思ったら、すべてをSJISに統一するしかありません。index.phpもHTMLソースもcharsetも、すべてSJISを指定して書くことになります。この解決法は完全に「Windows環境で開発する」ことを意味していると思います。Linuxで、サーバもUNIXの予定です。Linux環境でテキストはUTF-8ですし、HTMLソースやcharsetを書き換えるのも面倒です。なんにせよ、文字化けの原因は文字コードです。それで試行錯誤の結果、自分なりの方法を見つけたので記事にすることにしました。()関数で相互変換する。PHP内部ではUTF-8を使い、Windows上のファイル名はCP932を使う」です。){//xampp対応。Windows系の場合、文字コードを変換。他の箇所で使う予定もあったので、内部コードから環境の文字コードへの変換は、関数にまとめました。){//xampp対応。Windows系の場合、文字コードを変換。$localString;}この方法ならxampp環境を変更せずにソースの変更だけで済みます。他の方法より書いたり管理するのが単純です。・PHPの内部エンコーディングはUTF-8・使っているHTMLソースもUTF-8・Windows日本語環境はCP932(≒SJIS)よって、「Windowsファイルシステムを読み書きする際に文字コード変換の必要有り」です。そこで、PHP内部ではファイル名をUTF-8で取り扱います。ファイルを読み書きする際に、ファイル名を表す文字列を文字コード変換してから、ファイルを開きます。これにより、PHP内部ではUTF-8以外の文字コードを扱うことによる問題を最小限に抑えられます。変換するかどうかは、OSの種類がWindowsかどうかを判別して決めますが、「とりあえず関数に通す」だけで済むようにして、コードが複雑になるのを防ぎます。そもそも、私の書いていたWebページの不具合は、文字コードが原因である、独立した2つの問題でした。・POSTで取得した日本語ファイルを保存すると、文字化けしている。・日本語画像ファイルをWebページに表示しようとすると、ファイル名が文字化けして、画像が表示できない。今回扱ったのはファイル名の文字コードであり、テキストファイルの内容は文字コードを変更していません。今回書いたWebページでは、テキストファイルはすべてWebページ上のテキストボックスから書き込み、PHPを通してWebページへ書き戻すので、読み書きがすべてUTF-8で完結しています。書き出したテキストファイルをメモ帳などのWindowsアプリケーションで読み書きする場合は、ファイルから読み出したテキストデータも文字コード変換する必要があるかもしれません。(TeraPadなどのUTF-8対応テキストエディタを使ったほうが楽だと思いますが。)「mb_convert_encoding()を使ってエラーが出るときは、mb_language("Japanese");を宣言するといいよ」と書いてあるサイト様を見かけましたが、今回の例では不要でした。最後に参考サイト様を。OSの判定方法は、PHPリファレンスマニュアルのphp_uname()関数から。アップロードファイルの書き出しは、サイト様のXAMPP(Apache+PHP+MySQL+Mercury)での文字コード関連関連から。mini2を試験導入していてすごく便利で体感が良かったです。nijiflowをベースに、機械学習で艦これとアズールレーンの画像の分類器を作り、学習済みグラフ等を公開した。これのTwitterBotを作成し公開している。データセットはPixivのタグ付け済み画像情報を元に作成した。Web上にあまり開封写真等の詳細がなかったので残しておきます。モノが大きいためか、知らない運送会社でおくられてきた。...JavaScriptで、変数を使った正規表現マッチング例および失敗例は、自作のJavaScriptソースから抜粋。※例ごとにマッチする文字列が違いますがご容赦ください。(8)SQLite3とphpのPDOを使用した、DBテーブルの自動作成XAMPP環境における日本語ファイル名の文字化け解決法Knotterを使ってみた。