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

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

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

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

Q&A

解決済

2回答

1434閲覧

エクセルファイルのインポート時 文字化けへの対処法

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2019/08/22 07:49

編集2019/08/23 01:49

https://www.phpclasses.org/blog/post/571-php-xlsx-mysql.html

上記URLの説明通りにPHPを作成してみました。

include 'simplexlsx.class.php'; $xlsx = new SimpleXLSX( 'countries_and_population.xlsx' ); try { $conn = new PDO( "mysql:host=localhost;dbname=mydb", "user", "pass"); $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $stmt = $conn->prepare( "INSERT INTO countries_and_population (rank, country, population, date_of_estimate, powp) VALUES (?, ?, ?, ?, ?)"); $stmt->bindParam( 1, $rank); $stmt->bindParam( 2, $country); $stmt->bindParam( 3, $population); $stmt->bindParam( 4, $date_of_estimate); $stmt->bindParam( 5, $powp); foreach ($xlsx->rows() as $fields) { $rank = $fields[0]; $country = $fields[1]; $population = $fields[2]; $date_of_estimate = $fields[3]; $powp = $fields[4]; $stmt->execute(); }

上記サンプルの通りに作成してみたら、動作自体はきちんと動作したのですが、登録されたデータが文字化けしていました。

  • $fields[0]
  • $fields
  • $rank
  • $xlsx

に対して「mb_convert_encoding($str,"utf8")」をかけても文字化けしてしまいます。

simplexlsx.class.php のソースをみたら、mb_strlenなどの記述に「8bit」という記述があったので、「16bit」に書き換えても変化しませんでした。(多分これは違うとも感じました。)

データベース登録時の文字化け解消法を教えていただきたく、お願い致します。

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

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

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

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

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

m.ts10806

2019/08/22 08:33

実際どういうデータがどう文字化けしているのでしょうか。 スクリーンショットなどご提示いただけますか?
m.ts10806

2019/08/22 08:40

あともう2点、そのphpMyAdminで当該テーブルの「構造」タブもキャプチャご提示願います。 テーブル定義を確認したいです。 もう1点 Excelのキャプチャも可能ですか?
m.ts10806

2019/08/22 08:42

何度もすみません。 >に対して「mb_convert_encoding($str,"utf8")」をかけても文字化けしてしまいます。 これ、やってみたコード提示お願いします。 また、変換直後のDB登録前のデータを画面出力するとどうなりますか?
退会済みユーザー

退会済みユーザー

2019/08/22 08:45

>mb_convert_encoding($str,"utf8" は、現在貼り付けている画像が、”担当者名だけ”に対してエンコードかけたときの実行結果です
退会済みユーザー

退会済みユーザー

2019/08/22 08:46

エクセルのキャプチャについては、個人情報や機密情報が含まれていますのでご勘弁いただきたくお願いいたします。
m.ts10806

2019/08/22 08:49

担当者名がどれか分かりませんが、下記の実行結果を知りたいです。 echo mb_convert_encoding($str,"utf8"); そこで文字化けのままなら登録しても当然文字化けしているので。 >エクセルのキャプチャについては、個人情報や機密情報が含まれていますのでご勘弁いただきたくお願いいたします。 了解です。 ※ただこの場合ですと、文字化けしているとはいえ現在提示されているものもNGのような気がします。
退会済みユーザー

退会済みユーザー

2019/08/22 08:58

担当者名は、1番はじめの列になります。 画像は後ほど削除します。
退会済みユーザー

退会済みユーザー

2019/08/22 09:26 編集

一番最初に記述したコードでいうところの「foreach ($xlsx->rows() as $fields)」の上の行に 「echo mb_detect_encoding($fields);」と追記してみたところ、文字コードが「ASCII」と表示されました。 エクセルのファイルはWindows環境(EXCEL2013)を使用し、サーバーはXAMPPのWindows版を使用しているため、ASCIIコードで保存するはずもなく、最初に怪しいと思った「simplexlsx.class.php」で1バイト文字のエンコードが入っているのかもしれないと感じてきました。
退会済みユーザー

退会済みユーザー

2019/08/22 10:29

phpでのエンコーディング自動判定ってびみょーだった気がするから、ちゃんと「何から」utf-8に変換するのかを指定すると良いかも。
退会済みユーザー

退会済みユーザー

2019/08/22 10:40

phpやmysqlデータベースのエンコーディングは点検済みかな? latin1とかになっていたりしないよね?
退会済みユーザー

退会済みユーザー

2019/08/22 10:49

xlsxってzipの構造に収まったxmlの塊で、sheet1.xmlとか開くとxml宣言箇所でUTF-8って書いてあるのだから、まさかSJIS他のエンコードで値を持っているはずもなく。なので、データベースのエンコーディングを確認するのをお忘れなく。
退会済みユーザー

退会済みユーザー

2019/08/22 11:01

エクセルのファイルはWindows環境で作成した”SJIS-win”です。これをPHPでアップロードし、それをMySQLにPHPで登録する際「simplexlsx.class.php」を通して登録しようとすると、そこで「ASCII」に変換されるのかわかりませんが文字化けするんです。php.iniを確認しましたがUTF-8に設定しています。
退会済みユーザー

退会済みユーザー

2019/08/22 11:03

ちなみにエクセルのファイルを文字コード判別ソフトに当ててもSJIS判定が出ます。
退会済みユーザー

退会済みユーザー

2019/08/22 11:04

また「mb_convert_encoding($fields,"utf8","sjis-win")」でやっても文字化けしていました。
退会済みユーザー

退会済みユーザー

2019/08/22 11:47

> エクセルのファイルはWindows環境で作成した”SJIS-win”です でも、xlsxとして保存すればそいつはBOMなしUTF-8のはずですが。 xlsxファイルを念の為コピーして拡張子をzipにして、解凍ツールで覗いて、 含まれるxmlを一度テキストエディタなどで調べてみてください。 あるいは、phpSpreadsheetだっけ、の方が事例が多そうな気がするのでそちらも試す。
m.ts10806

2019/08/23 01:51

一応、、、 質問本文のマークダウン記述が削除されただけで画像本体が削除されたわけではないので。 変更履歴から得られないことはなかったりします。 本当にマズいものなのであれば質問自体削除依頼をされたほうが良いです。
guest

回答2

0

latin1だったら直そう。

MySQLでデータベースとテーブルの文字コードがlatin1だったのでUTF-8にする - Qiita

latin1じゃなくutf-8であれば、
php.iniでのエンコーディングも確認する。
phpからデータベースにアクセスするときのエンコーディングの指定も点検する。

投稿2019/08/22 10:50

編集2019/08/22 10:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

皆様大変お騒がせしました。
私の”思い込み”が原因で、ここまでこじれてしまいましたが、無事解決できました。

皆さんの返答をひとつひとつ確認していったところ
(1)xlsxファイルはUTF-8だったこと
(2)XAMPPで設置したMySQL(MariaDB 10.3.16)の文字コードセットが、何も設定を変更しないと「latin1」だったこと

解決するにあたり、
(1)対象xlmsを「展開」してxmlファイルを抽出したところ文字セットがUTF8であった
(2)コマンドプロンプトからMySQLを実行し「show variables like "chara%";」を実行したところ、文字コードが「latin1」だった

という検証結果が出ました。

https://www.dbonline.jp/mysql/myini/index3.html
上記サイトを参考にして「my.ini」の設定を変更したら、無事UTF-8で登録することに成功しました。

皆様、お忙しい中いろいろ教えていただき、誠にありがとうございまし

投稿2019/08/23 01:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問