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

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

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

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

解決済

PerlでMariaDBからデータを入れてhtml出力すると文字化けします

snow2021
snow2021

総合スコア11

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

2回答

0評価

0クリップ

342閲覧

投稿2022/03/07 21:04

編集2022/04/11 13:03

CGIをPerlで書いて、MariaDBからデータを抽出して、HTML出力した場合、なぜか文字化けします。
CGIファイルは、UTF-8です。

MariaDBに対して、「show variables like 'char%'」を打つと、下のようになります。
character_set_client : utf8mb4
character_set_connection : utf8mb4
character_set_database : utf8mb4
character_set_filesystem : binary
character_set_results : utf8mb4
character_set_server : utf8mb4
character_set_system : utf8
character_sets_dir : /usr/share/mysql/charsets/

character_set_filesystem 以外、utf8の方がよさそうですが、インターネットのサーバー上にあるため、my.iniファイルが変更する方法がわかりません。

クライアント側の環境:Windows11
サーバー側の環境: Linux
サーバの種類 : MariaDB
サーバのバージョン: 10.5.13-MariaDB-log - MariaDB Server
プロトコル バージョン : 10
ウェブサーバ : Apache
データベースクライアントのバージョン: libmysql - 10.1.48-MariaDB

CGIはHTMLファイルのテンプレートを読み込んで、データを埋め込む形にしています。
エラーとしては、「[sample.cgi:206:warn] Wide character in print at sample.cgi line 206.」とWeb上で表示されています。
206行目は、HTMLタグにデータを埋め込んだ変数をprintしています。

なお、DBのデータだけでなく、data.plファイルをrequireしてsample.cgiの変数に格納してHTML出力していますが、こちらの文字列も文字化けしています。data.plファイルも、UTF-8です。
plファイルの中身は、設定ファイルになっており、web siteの名前とか、site管理者の名前などがハッシュに格納されています。
大体が、「ブログ」という感じで表示されています。

+------+------------+----+----+-------+----------------+
|Field -|Type -------|Null| Key|Default| Extra |
+------+------------+----+----+-------+----------------+
|id |int(6): | NO | PRI| NULL | auto_increment|
+------+------------+----+----+-------+----------------+
|t_bi |datetime | NO | | NULL | |
+------+------------+----+----+-------+----------------+
|ca_no |int(2) | NO | | NULL | |
+------+------------+----+----+-------+----------------+
|title |varchar(400)| NO | | NULL | |
+------+------------+----+----+-------+----------------+
|kizi |text | NO | | NULL | |
+------+------------+----+----+-------+----------------+
|k_bi |datetime |YES | | NULL | |
+------+------------+----+----+-------+----------------+
|iine |int(10) | NO | | 0 | |
+------+------------+----+----+-------+----------------+
|user |varchar(100)| NO | | NULL | |
+------+------------+----+----+-------+----------------+

perl

use strict; use DBI; require 'data.pl'; require 'db.pl'; my %out = &out_set; my %in = &parse_deco; my $data_source = $out{"data_source"}; my $username = $out{"username"}; my $password = $out{"password"}; my $user_nm = $in{"user_name"}; my $categpry = 1; # DB接続 my $dbh = DBI->connect($data_source, $username, $password,{mysql_enable_utf8 => 1}) or die $DBI::errstr; my $sth = $dbh->prepare(qq{ SELECT * FROM blog WHERE user = '$user_nm' AND ca_no = '$categpry' ORDER BY id DESC LIMIT 1 }); $sth->execute; my %row; my $i = 0; while (my $ary_ref = $sth->fetchrow_arrayref){ ($row{"id_$i"},$row{"t_bi_$i"},$row{"ca_no_$i"},$row{"title_$i"},$row{"kizi_$i"},$row{"k_bi_$i"},$row{"iine_$i"},$row{"user_$i"}) = @$ary_ref; $i++; } $sth->finish; my $sth2 = $dbh->prepare(qq{ SELECT t_bi FROM blog WHERE user = '$user_nm' AND ca_no = '$categpry' }); $sth2->execute; my @tourokubi = (); my $t = 0; while (my $ary_ref = $sth2->fetchrow_arrayref){ ($tourokubi[$t]) = @$ary_ref; $t++; } $sth2->finish; my $sth3; my ($yaer,$month); my %month; foreach(@tourokubi){ $_ =~ /(\d\d\d\d)-(\d\d)-(\d\d)/; $yaer = $1; $month = $2; $sth3 = $dbh->prepare(qq{ SELECT COUNT(*) FROM blog WHERE user = '$user_nm' AND ca_no = '$categpry' AND t_bi LIKE '%$yaer-$month%' }); $sth3->execute; while (my $ary_ref = $sth3->fetchrow_arrayref){ ($month{"$yaer-$month"}) = @$ary_ref; $t++; } $sth3->finish; $sth3 = ""; } # DB切断 $dbh->disconnect; # HTML表示 print <<"TAG"; Content-type:text/html <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>DB test</title> </head> <body> TAG my $key; foreach $key( keys %row){ print qq|$key = $row{"$key"}<br>\n|; } my $key2; my $yyyymm; foreach $key2( sort keys %month){ $yyyymm = $key2; $yyyymm =~ s/(\d\d\d\d)-(\d\d)/$1年$2月/; print "$yyyymm($month{$key2})<br>\n"; # count } print <<"TAG2"; </body> </html> TAG2 exit;

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

m.ts10806

2022/03/07 21:12

テーブル定義も提示してください。 あと、コードも。
snow2021

2022/03/07 21:43

テーブル定義とコード無しですみませんでした。 テーブル定義は、下のようになっています。 +------+------------+----+----+-------+----------------+ |Field |Type |Null| Key|Default| Extra | +------+------------+----+----+-------+----------------+ |id |int(6): | NO | PRI| NULL | auto_increment| +------+------------+----+----+-------+----------------+ |t_bi |datetime | NO | | NULL | | +------+------------+----+----+-------+----------------+ |ca_no |int(2) | NO | | NULL | | +------+------------+----+----+-------+----------------+ |title |varchar(400)| NO | | NULL | | +------+------------+----+----+-------+----------------+ |kizi |text | NO | | NULL | | +------+------------+----+----+-------+----------------+ |k_bi |datetime |YES | | NULL | | +------+------------+----+----+-------+----------------+ |iine |int(10) | NO | | 0 | | +------+------------+----+----+-------+----------------+ |user |varchar(100)| NO | | NULL | | +------+------------+----+----+-------+----------------+ コードは、以下のようになります。 use strict; #use KCatch; use DBI; require 'data.pl'; require 'db_setuzoku.pl'; my %out = &out_set; my %in = &parse_deco; my $data_source = $out{"data_source"}; my $username = $out{"username"}; my $password = $out{"password"}; my $user_nm = $in{"user_name"}; my $categpry = 1; # DB接続 my $dbh = DBI->connect($data_source, $username, $password,{mysql_enable_utf8 => 1}) or die $DBI::errstr; # SELECT * FROM blog WHERE user = $user_nm, ca_no = $categpry, t_bi LIKE '%2021-04-23 %' # SELECT * FROM blog WHERE`ca_no`='1' AND `user`='snow' ORDER BY `id` DESC LIMIT 1 my $sth = $dbh->prepare(qq{ SELECT * FROM blog WHERE user = '$user_nm' AND ca_no = '$categpry' ORDER BY id DESC LIMIT 1 }); $sth->execute; my %row; my $i = 0; while (my $ary_ref = $sth->fetchrow_arrayref){ ($row{"id_$i"},$row{"t_bi_$i"},$row{"ca_no_$i"},$row{"title_$i"},$row{"kizi_$i"},$row{"k_bi_$i"},$row{"iine_$i"},$row{"user_$i"}) = @$ary_ref; $i++; } $sth->finish; my $sth2 = $dbh->prepare(qq{ SELECT t_bi FROM blog WHERE user = '$user_nm' AND ca_no = '$categpry' }); $sth2->execute; my @tourokubi = (); my $t = 0; while (my $ary_ref = $sth2->fetchrow_arrayref){ ($tourokubi[$t]) = @$ary_ref; $t++; } $sth2->finish; my $sth3; my ($yaer,$month); my %month; foreach(@tourokubi){ $_ =~ /(\d\d\d\d)-(\d\d)-(\d\d)/; $yaer = $1; $month = $2; $sth3 = $dbh->prepare(qq{ SELECT COUNT(*) FROM blog WHERE user = '$user_nm' AND ca_no = '$categpry' AND t_bi LIKE '%$yaer-$month%' }); $sth3->execute; while (my $ary_ref = $sth3->fetchrow_arrayref){ ($month{"$yaer-$month"}) = @$ary_ref; $t++; } $sth3->finish; $sth3 = ""; } # DB切断 $dbh->disconnect; # HTML表示 print <<"TAG"; Content-type:text/html <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>DB test</title> </head> <body> TAG my $key; foreach $key( keys %row){ print qq|$key = $row{"$key"}<br>\n|; } my $key2; my $yyyymm; foreach $key2( sort keys %month){ $yyyymm = $key2; $yyyymm =~ s/(\d\d\d\d)-(\d\d)/$1年$2月/; print "$yyyymm($month{$key2})<br>\n"; # count } print <<"TAG2"; </body> </html> TAG2 exit;
m.ts10806

2022/03/07 22:52

質問は編集できますし、コメントではマークダウンの機能が使えませんので、質問本文に移行してください。 ※あとコードはそのまま提示ではなくマークダウンのcodeを利用してください。https://teratail.com/questions/238564
snow2021

2022/03/07 23:10

重ね重ねすみません。 質問の本文に加筆しました。 これでよいでしょうか?

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。