質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

6711閲覧

sjisの日本語ファイル名のファイルが処理できない

hatsuzo

総合スコア56

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2019/02/14 23:58

WindowsServer上で動作するphpで、WindowsServer上にある日本語ファイル名を取り扱おうとすると、特定の漢字を含む場合、エラーになってしまいます。

php

1if (!copy($fullpath, 'tmp.xlsx')) { 2 print "failed to copy $fullpath...\n"; 3}

環境としては、ソースはsjisでdefault_charsetもsjisです。
Sjisで5Cを含むコード(「十」という漢字など)が原因であることは判っているのですが、ファイル名を変える訳にはいかないので、取り扱いに悩んでいます。
この場合、文字の後にエスケープコードを入れてやれば正常に扱えるのでしょうか?
本来であれば、5cを含む漢字全てに対応したいのですが、先ず特定文字での置換を正規表現で書いてみましたが、知識不足でうまくいきません。

php

1$str = '201902五六七八九十零一二三.xlsx'; 2// 5341は十のunicode 3$str_grep = preg_replace('/(.*)(\u5341)(.*)/', '$1$2$3', $str); 4echo $str_grep;

基礎的なことかもしれませんが教えて頂けると助かります。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/02/15 00:50

コメント有難うございます。 そうなんですね。対象がエンドユーザの入力するExcelファイルなので、日本語名でないと、抵抗が強いのです。phpでExcelファイルを読み取って操作する処理(phpspreadsheet使用)なのですが、ここでも日本語のファイル名が扱えず、やむなく日本語名のファイルにコピーしてからは動作したのですが、今度はコピーの段階でこの問題にぶつかりました。
guest

回答4

0

端的にいえばSJISで持ち続ける限りトラブルは回避できません
もし回避しようとするなら膨大な知識と手間が必要です。

ある意味アプローチの仕方をかえて
ファイルの置き場をlinuxのsamba上に置くというやり方があります。
そうすると、ファイルをコピー(保存)した時点で、
サーバー上ではutf8やeucなどのファイル名で保管されるので
プログラムが参照するときに5C問題に悩まされることはありません

投稿2019/02/15 02:23

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/02/15 02:48

コメント有難うございました。 sambaはそういうことが出来るんですね。 sambaを使ってドメイン管理とファイル管理をできればADの呪縛から解き放たれていいなとは思うのですが、そこまでのスキルと勇気が無いので実行できません。 情報を頂き有難うございました。
maisumakun

2019/02/15 02:54

DBサーバにつなぐ場合にも、5C問題はかなり効いてきます。最悪の場合、SQLインジェクションの原因ともなりかねません。
hatsuzo

2019/02/15 06:25

有難うございます。 そっちもあるんですね。 何も知らずにSjisで作っているMysqlのサーバがありますが、utfにするべきなんでしょうね。
guest

0

ベストアンサー

ソフトウェアのほとんどはシングルバイト圏で作られています。ファイル名やディレクトリ名にマルチバイト圏固有の全角文字などは使わない、のが吉(あえて地雷原をコースにしたい人を除く)です。

投稿2019/02/15 00:38

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/02/15 00:51

コメント有難うございます。 その通りです。止む無く使わざるを得ないので、出てきた問題です。
Orlofsky

2019/02/15 02:07

和暦を廃止して西暦に統一する時は西暦と和暦の対応表 https://qiita.com/Papageno/items/70659325d1d578aab8e8 くらいは用意します。 同じように、ファイル名が決まっているなら、半角英数字のファイル名との対応表を用意するとか、プログラムの中からコマンドプロンプトでrenameするようなことで対応できませんか?
hatsuzo

2019/02/15 02:36

コメント有難うございます。 エンドユーザの使うファイル名なので止む無く日本語名になっているのでリネームはできません。このためレプリカを作って処理することに辿り着きました。 最悪はコマンド発行しかないなと思っていたのですが、非同期の実行になってしまうので結果の取得ができないとためらっていました。 よく調べてみると、systemではなく、execを使えば、ファイル名が無いとかの失敗も取得できるのですね。これでなんとか動作することを確認しました。 exec('copy '.$fname.' tmp.xls', $out, $sts); どうも有り難うございました。
hatsuzo

2019/02/15 06:22

お恥ずかしい話ですが、今度は、別の問題で処理が出来なくなりました。 コマンドラインでcopyは確かに動作するのですが、コピー元のファイル名に全角のスペースが入っていると、今度は「指定されたファイルが見つかりません」というエラーが返ってきます。 やはりファイル名を変えないと駄目なのかもしれません。しかし、フォルダ内のExcelファイルを全て読むという処理なので、ファイル名を変えられてしまったらアウトです。なにか良い方策はないでしょうか?
guest

0

preg_replaceシフトJISに対応していません(いちおう、1バイト単位でコードを指定すれば可能ですが、文字区切りを誤る危険もあります)。mb_ereg_replaceなどを使いましょう。

投稿2019/02/15 00:13

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/02/15 02:49

コメント有難うございます。 確かに文字区切りが難しそうですね。
guest

0

以下のように、ファイル名をsjisに変換してから取り扱ってみてはどうでしょうか?

php

1$encodedFileName = mb_convert_encoding($fileName, 'SJIS', 'auto');

投稿2019/02/15 00:26

noka_blank

総合スコア252

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/02/15 02:36

コメント有難うございます。 試してみましたが、駄目でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問