teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

抜粋コードを確認できるようになりました。

2015/12/16 06:09

投稿

motokix
motokix

スコア13

title CHANGED
File without changes
body CHANGED
@@ -157,7 +157,6 @@
157
157
  foreach (keys %fm_param) {
158
158
  print "\$fm_param\{$_\} = $fm_param{$_}<br>\n";
159
159
  }
160
- print "HTMLにかけるように変更";
161
160
  foreach (@item_names) {
162
161
  my $name = conv_html($item_disp{$_});
163
162
  my $value = conv_html($item_value{$_});

3

動くコードに編集しました。

2015/12/16 06:09

投稿

motokix
motokix

スコア13

title CHANGED
File without changes
body CHANGED
@@ -22,97 +22,244 @@
22
22
  のようになってしまいます。
23
23
  ```perl
24
24
  コード
25
-
25
+ #!/usr/bin/perl
26
26
  use strict;
27
-
28
27
  use Encode;
29
28
  use Encode::Guess;
30
29
  use Encode::EUCJPMS;
31
30
  #use Jcode;
32
31
  use CGI;
32
+ use utf8;
33
33
  my $cgi = new CGI;
34
- require 'mimew.pl'; # jcode($subject)->mime_encode が動かないとき
34
+ require 'mimew.pl'; # jcode($subject)->mime_encode が動かないとき
35
35
  #エラーメッセージをブラウザに表示
36
36
  use CGI::Carp qw(fatalsToBrowser);
37
37
  use Data::Dumper;
38
+ ###################################
39
+ print "Content-Type: text/html; charset=utf-8\n\n";
40
+ # 項目名
38
- my @checkboxes_array;
41
+ my @item_names = ();
42
+ # 項目の日本語表示名
43
+ my %item_disp = ();
44
+ # 項目の値
45
+ my %item_value = ();
46
+ # 項目の必須有無
47
+ my %item_need = ();
48
+ # フォームパラメータ
49
+ my %fm_param = ();
50
+ my $cgi_url = $cgi->url(); # このCGIのURL
39
51
 
52
+ #######################################################################
53
+ # 入力文字コード判定
54
+ #######################################################################
55
+ my $input_value = '';
56
+ my $name;
57
+ my $value;
58
+ my @values;
40
59
  foreach $name ($cgi->param) {
41
- if ($name =~ /^fm_/) { # フォームパラメータ
60
+ if ($name !~ /^submit$/i) { # 項目('submit'は除く)
42
- $value = $cgi->param($name);
61
+ @values = $cgi->param($name);
62
+ $value = join(',', @values);
43
- if($cgi->param('fm_command') eq 'confsend') { # 確認フォームからのときデコード
63
+ if($cgi->param('fm_command') eq 'confsend') { # 確認フォームからのときデコード
44
- $value = pack_param($value);
64
+ $value = pack_param($value);
45
- }
65
+ }
46
- #$value = jcode($value, $input_jcode)->sjis;
47
- $value = ($guess->name ne 'shiftjis') ? encode('utf8', decode($guess_encode, $value)) : $value;
48
- $fm_param{$name} = $value;
49
- if($name =~ /^fm_disp_(\w+)/) { # 項目の日本語表示名
50
- $item_disp{$1} = $value;
66
+ $input_value .= $value;
51
- if(!defined $item_value{$1}) {
52
- push(@item_names, $1);
53
- $item_value{$1} = '';
54
- }
67
+ }
55
- } elsif($name =~ /^fm_need_(\w+)/) { # 項目の入力必須
56
- $item_need{$1} = $value;
57
- }
68
+ }
58
- } elsif($name !~ /^submit$/i) { # 項目('submit'は除く)
59
- if(!defined $item_value{$name}) {
69
+ #エラーメッセージ配列
60
- push(@item_names, $name);
70
+ my @err_namelist = ();
61
- }
62
- @values = $cgi->param($name);
63
71
 
64
- my $len = @values;
72
+ #送信データがなければエラーとする
65
- if ($len > 1) {
73
+ if (0 == length($input_value)) {
74
+ push(@err_namelist, '呼び出しエラーです。管理者にお問い合わせ下さい。');
75
+ print_input_error(@err_namelist);
76
+ exit;
77
+ }
66
78
 
67
- for (my $k=0; $k $name,
68
- len => $len,
69
- #values => @values,
70
- values => [],
71
- };
72
- for (my $k=0; $k{values}}, @values[$k]);
79
+ #$input_jcode = Jcode::getcode($input_value);
73
- }
74
- push(@checkboxes_array, $object);
80
+ my $guess = guess_encoding($input_value, qw/euc-jp shiftjis 7bit-jis/);
75
- }
81
+ my $guess_encode = ($guess->name eq 'euc-jp') ? 'eucJP-ms' : $guess->name;
76
82
 
77
- $value = join(',', @values);
78
- if($cgi->param('fm_command') eq 'confsend') { # 確認フォームからのときデコード
83
+ #######################################################################
79
- $value = pack_param($value);
84
+ # パラメータ読み込み
80
- }
81
- #$item_value{$name} = jcode($value, $input_jcode)->sjis;
85
+ #######################################################################
82
- $item_value{$name} = ($guess->name ne 'shiftjis') ? encode('utf8', decode($guess_encode, $value)) : $value;
83
86
 
87
+ my @checkboxes_array;
88
+
89
+ foreach $name ($cgi->param) {
90
+ if ($name =~ /^fm_/) { # フォームパラメータ
91
+ $value = $cgi->param($name);
92
+ if($cgi->param('fm_command') eq 'confsend') { # 確認フォームからのときデコード
93
+ $value = pack_param($value);
94
+ }
95
+ #$value = jcode($value, $input_jcode)->sjis;
96
+ $value = ($guess->name ne 'shiftjis') ? encode('utf8', decode($guess_encode, $value)) : $value;
97
+ $fm_param{$name} = $value;
98
+ if($name =~ /^fm_disp_(\w+)/) { # 項目の日本語表示名
99
+ $item_disp{$1} = $value;
100
+ if(!defined $item_value{$1}) {
101
+ push(@item_names, $1);
102
+ $item_value{$1} = '';
103
+ }
104
+ } elsif($name =~ /^fm_need_(\w+)/) { # 項目の入力必須
105
+ $item_need{$1} = $value;
106
+ }
107
+ } elsif($name !~ /^submit$/i) { # 項目('submit'は除く)
108
+ if(!defined $item_value{$name}) {
109
+ push(@item_names, $name);
110
+ }
111
+ @values = $cgi->param($name);
112
+
113
+ my $len = @values;
114
+ if ($len > 1) {
115
+ logger($name . 'はチェックボックスなのです!で項目数は' . $len . 'なのです!(ただし複数選択可能なselectタグかもしれない・・・けど項目の上限を決めておけばいい($lenが上限以下ならselectでも項目をCSVに出す等))');
116
+ for (my $k=0; $k<$len; $k++) {
117
+ logger(@values[$k]);
118
+ }
119
+ #MEMO:
120
+ #確認画面で項目数がここでわかったので、後ろの画面に$nameは$len項目ですと渡せばcsvでいい感じにできるのです!
121
+ #実際の処理には現状確認画面でスペース?区切りか何かにされてしまっているため、項目数がうまくは取れないと思われる(確認画面のhiddenタグ参照の事)
122
+ my $object = {
123
+ name => $name,
124
+ len => $len,
125
+ #values => @values,
126
+ values => [],
127
+ };
128
+ for (my $k=0; $k<$len; $k++) {
129
+ logger(@values[$k]);
130
+ push(@{$object->{values}}, @values[$k]);
131
+ }
132
+ push(@checkboxes_array, $object);
133
+ }
134
+
135
+ $value = join(',', @values);
136
+ if($cgi->param('fm_command') eq 'confsend') { # 確認フォームからのときデコード
137
+ $value = pack_param($value);
138
+ }
139
+ #$item_value{$name} = jcode($value, $input_jcode)->sjis;
140
+ $item_value{$name} = ($guess->name ne 'shiftjis') ? encode('utf8', decode($guess_encode, $value)) : $value;
141
+
84
- if($item_disp{$name} eq '') {
142
+ if($item_disp{$name} eq '') {
85
- $item_disp{$name} = $name;
143
+ $item_disp{$name} = $name;
86
- }
144
+ }
87
- }
145
+ }
88
146
  }
89
147
 
90
148
  my $len = @checkboxes_array;
91
149
  if ($len > 0) {
92
- logger('新規オブジェクト配列は' . $len);
150
+ logger('新規オブジェクト配列は' . $len);
93
- for (my $i=0; $i{name});
151
+ for (my $i=0; $i<$len; $i++) {
152
+ logger(@checkboxes_array[$i]->{name});
94
- logger(Dumper @checkboxes_array[$i]);
153
+ logger(Dumper @checkboxes_array[$i]);
95
- }
154
+ }
96
- }`
155
+ }
97
156
 
157
+ foreach (keys %fm_param) {
158
+ print "\$fm_param\{$_\} = $fm_param{$_}<br>\n";
159
+ }
160
+ print "HTMLにかけるように変更";
161
+ foreach (@item_names) {
162
+ my $name = conv_html($item_disp{$_});
163
+ my $value = conv_html($item_value{$_});
164
+ print "$name:$value ($item_need{$_})<br>\n";
165
+
166
+ }
167
+ exit;
98
168
 
169
+ ### csvに書けるように変換
170
+ sub conv_csv {
171
+ my ($str) = @_;
172
+ # $str =~ s/</&lt;/g;
173
+ # $str =~ s/>/&gt;/g;
174
+ $str =~ s/\t//g;
175
+ $str =~ s/\r//g;
176
+ $str =~ s/\n//g;
177
+ $str =~ s/\,/"\,\"/g;
178
+ #$str =~ s/"/""/g;
179
+ return '"' . $str . '"';
180
+ #return '' . $str . '';
181
+ }
182
+ sub conv_tsv {
183
+ my ($str) = @_;
184
+ # $str =~ s/</&lt;/g;
185
+ # $str =~ s/>/&gt;/g;
186
+ $str =~ s/\t//g;
187
+ $str =~ s/\r//g;
188
+ $str =~ s/\n//g;
189
+ $str =~ s/\,/"\t\"/g;
190
+ # $str =~ s/"/""/g;
191
+ return '"' . $str . '"';
192
+ #return '' . $str . '';
193
+ }
99
194
 
195
+ ### htmlで表示できるように変換
196
+ sub conv_html {
197
+ my ($str) = @_;
198
+
199
+ $str =~ s/</&lt;/g;
200
+ $str =~ s/>/&gt;/g;
201
+ $str =~ s/\t//g;
202
+ $str =~ s/\r//g;
203
+ $str =~ s/\,/&nbsp;/g;
204
+ $str =~ s/\n/<br>\n/g;
205
+
206
+ return $str;
207
+ }
208
+
209
+ ### htmlで表示できるように変換
210
+ sub conv_html2 {
211
+ my ($str) = @_;
212
+
213
+ $str =~ s/</&lt;/g;
214
+ $str =~ s/>/&gt;/g;
215
+ $str =~ s/\t//g;
216
+ $str =~ s/\r//g;
217
+ #$str =~ s/\,/&nbsp;/g;
218
+ $str =~ s/\n/<br>\n/g;
219
+
220
+ return $str;
221
+ }
222
+ sub conv_mail {
223
+ my ($str) = @_;
224
+ # $str =~ s/</&lt;/g;
225
+ # $str =~ s/>/&gt;/g;
226
+ $str =~ s/\t//g;
227
+ $str =~ s/\r//g;
228
+ $str =~ s/\n//g;
229
+ $str =~ s/\,/"\t\"/g;
230
+ # $str =~ s/"/""/g;
231
+ return '"' . $str . '"';
232
+ #return '' . $str . '';
233
+ }
234
+
100
235
  ### hiddenパラメータに格納できるようにエンコード
101
236
  sub unpack_param {
102
- my ($str) = @_;
237
+ my ($str) = @_;
103
-
238
+
104
- $str =~ s/([^\w.\/\-@ ])/'%'.unpack('H2',$1)/eg;
239
+ $str =~ s/([^\w.\/\-@ ])/'%'.unpack('H2',$1)/eg;
105
-
240
+
106
- return $str;
241
+ return $str;
107
242
  }
108
243
 
109
244
  ### エンコードしたhiddenパラメータをデコード
110
245
  sub pack_param {
111
- my ($str) = @_;
246
+ my ($str) = @_;
247
+
248
+ $str =~ s/%([A-Fa-f0-9]{2})/pack('H2', $1)/eg;
249
+
250
+ return $str;
251
+ }
112
252
 
253
+ sub conv_ahtml {
254
+ my ($str) = @_;
255
+ # $str =~ s/</&lt;/g;
256
+ # $str =~ s/>/&gt;/g;
257
+ $str =~ s/\t//g;
258
+ $str =~ s/\r//g;
113
- $str =~ s/%([A-Fa-f0-9]{2})/pack('H2', $1)/eg;
259
+ $str =~ s/\n/<br>\n/g;
114
-
260
+
115
- return $str;
261
+ return $str;
116
262
  }
117
263
 
264
+
118
265
  ```

2

入力に至るまでの概要を記載しました

2015/12/16 06:05

投稿

motokix
motokix

スコア13

title CHANGED
File without changes
body CHANGED
@@ -5,11 +5,13 @@
5
5
  以下のようにパラメーターを取得しています。
6
6
 
7
7
  ソースコードは抜粋ですが、
8
- 入力フォームには
8
+ ```HTML
9
+
9
10
  <input type="text" name="name" id="name" value="名前" size="30">
10
11
  に対応するパラメーター
11
12
  <input type="hidden" name="fm_disp_name" id="fm_disp_name" value="お名前">
12
13
  <input type="hidden" name="fm_need_name" id="fm_need_name" value="1">
14
+ ```
13
15
  fm_disp_項目名 があるものには、項目名を
14
16
  fm_need_項目名
15
17
  を受け取る仕組みです。

1

発生がおきるまでのフローを記載しました。

2015/12/16 05:20

投稿

motokix
motokix

スコア13

title CHANGED
File without changes
body CHANGED
@@ -3,6 +3,21 @@
3
3
 
4
4
  現象はフォームから受け取ったコードが、Laten-1の文字コードが表示されてしまいます
5
5
  以下のようにパラメーターを取得しています。
6
+
7
+ ソースコードは抜粋ですが、
8
+ 入力フォームには
9
+ <input type="text" name="name" id="name" value="名前" size="30">
10
+ に対応するパラメーター
11
+ <input type="hidden" name="fm_disp_name" id="fm_disp_name" value="お名前">
12
+ <input type="hidden" name="fm_need_name" id="fm_need_name" value="1">
13
+ fm_disp_項目名 があるものには、項目名を
14
+ fm_need_項目名
15
+ を受け取る仕組みです。
16
+
17
+ フォームから入力した全角文字が文字化けしてしまいます。
18
+ 結果表示すると
19
+ お名前??????:Valueお名前値
20
+ のようになってしまいます。
6
21
  ```perl
7
22
  コード
8
23