ホーム > フォーラム > 質問箱 > xsns 1.14 の文字化け

xsns 1.14 の文字化け
投稿者: avocet | 投稿日時: 2015/8/28 14:34 | 閲覧: 10255回
avocet

お世話になっております。

 別スレッドで「Xsns でファイルアップロードが出来ない」の質問をさせていただいたものです。
 旧サイト「XOOPS 2.0.16a」のサイトから新サイト「XCL 2.2.3」へ xsns のデータ移行を行っています。
 旧サイトは euc-jp xsns 1.11 、新サイトは utf-8 xsns 1.14 です。

 旧サイトから backpack でデータベースをダウンロードし文字コード変換(euc-jp -> utf-8)、 backpack でリストアしました。添付ファイルはxoops_trust_path/uploads/xsns にそのままコピーしました。

 新サイトで xsns を立ち上げ、コミュニティ、トピックはなど移行出来たことは確認出来ましたが
1.コミュニティを開いたとき、掲示板の欄にトピック名(短縮形)が表示されますが、末尾が以下のように文字化けします。XXXは伏せ字です。すべてが文字化けするのではなく、文字数省略の場所に特定の文字が来たときに起こるようです。以下は一つの例です。
 「XXXXXX/XXXXXXX��...」
 このリンクをクリックしトピックを開くとトピック名は問題なく表示(以下)されます。
 「XXXXXX/XXXXXXXX (その2)」 ( の前は半角空白です。

2.日本語添付ファイルの文字化け
 移行したトピックで、添付ファイルが日本語を含む場合その個所が文字化けしています。
 3-3_No2(������ʬ).xlsx のように。
 このファイルのリンクをクリックした場合、IE11 と chrome とで動作が異なります。
 IE11 では、ファイル保存のダイアログでファイル名が文字化けしていて、文字化けした名前で保存されます。
 chrome では、ファイル保存のダイアログでファイル名が元の文字化けしていない名前で表示されそのまま保存できます。

3.新サイトで、新規に日本語を含むファイルを添付したときはトピック上ではファイル名は、文字化けせずにIE11 、chrome とも表示されます。保存すると両方文字化けして保存されます。
 元ファイル名:test_テストです.docx
 保存されたファイル名
  IE11 : test_魘サム・docx
  chrome : test_鴻с.docx

4.文字化けではないのですが、添付ファイルが付いたトピックを編集で開き、さらに添付ファイルを付けようとすると「ファイルを追加する」のリンクが表示されるのですが、これをクリックしても何事も起こらず、リンクにカーソルを当てると画面右下に「java script:void(0)」が表示されます。

 以上、長々と書きましたが、新サイトの運用が間近にせっまっており、困っております。
 勝手な思いですが、sxns は utf-8 相性が悪いのではないでしょうか?

 対応法など何かありましたらご教示よろしくお願いいたします。

コメント(10)

新しいものから | 古いものから | ネスト表示 | RSS feed
Re: xsns 1.14 の文字化け 
投稿者: nao-pon | 投稿日時: 2015/8/28 23:49
nao-pon

avocetさん、こんにちは。

確かにご指摘の通りの不具合がありますね。

とりあえず、手元で修正しているものの diff を貼り付けておきますね。移行前の添付ファイルの文字化け以外は多分直っていると思います。

移行前の添付ファイルの文字化けについては、後述しますがデータベースデータの修正が必要のようです。

まずは diff です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
diff --git a/extras/html/class/smarty/plugins/modifier.mb_truncate.php b/extras/html/class/smarty/plugins/modifier.mb_truncate.php
index fac9b46..2897b63 100644
--- a/extras/html/class/smarty/plugins/modifier.mb_truncate.php
+++ b/extras/html/class/smarty/plugins/modifier.mb_truncate.php
@@ -28,7 +28,7 @@ function smarty_modifier_mb_truncate($string, $length = 80, $etc = '...', $break
 	if ($length == 0){
 		return '';
 	}
-	$encode = 'EUC-JP';
+	$encode = defined('_CHARSET')? _CHARSET : 'UTF-8';
 	
 	// decode
 	$string = preg_replace(array("/&gt;/i", "/&lt;/i", "/&quot;/i", "/&#039;/i"), array(">", "<", "\"", "'"), $string);
diff --git a/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php b/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
index fac9b46..2897b63 100644
--- a/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
+++ b/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
@@ -28,7 +28,7 @@ function smarty_modifier_mb_truncate($string, $length = 80, $etc = '...', $break
 	if ($length == 0){
 		return '';
 	}
-	$encode = 'EUC-JP';
+	$encode = defined('_CHARSET')? _CHARSET : 'UTF-8';
 	
 	// decode
 	$string = preg_replace(array("/&gt;/i", "/&lt;/i", "/&quot;/i", "/&#039;/i"), array(">", "<", "\"", "'"), $string);
diff --git a/xoops_trust_path/modules/xsns/file.php b/xoops_trust_path/modules/xsns/file.php
index 3c00189..3c17963 100644
--- a/xoops_trust_path/modules/xsns/file.php
+++ b/xoops_trust_path/modules/xsns/file.php
@@ -66,10 +66,10 @@ $saved_filename = rawurldecode($org_filename);
 $ua = $_SERVER['HTTP_USER_AGENT'];
 
 if(strstr($ua, "MSIE") && !strstr($ua, 'Opera')){
-	$saved_filename = mb_convert_encoding($saved_filename, 'SJIS', 'EUC-JP');
+	$saved_filename = mb_convert_encoding($saved_filename, 'SJIS', _CHARSET);
 }
 else{
-	$saved_filename = mb_convert_encoding($saved_filename, 'UTF-8', 'EUC-JP');
+	$saved_filename = mb_convert_encoding($saved_filename, 'UTF-8', _CHARSET);
 }
 
 ini_set('include_path', XOOPS_TRUST_PATH.'/PEAR');
diff --git a/xoops_trust_path/modules/xsns/templates/topic_edit.html b/xoops_trust_path/modules/xsns/templates/topic_edit.html
index 4fbbfcd..8285572 100644
--- a/xoops_trust_path/modules/xsns/templates/topic_edit.html
+++ b/xoops_trust_path/modules/xsns/templates/topic_edit.html
@@ -74,7 +74,7 @@
 <{/section}>
 
 <div id="image_add">
-[<a href="java script:void(0);" onclick="Xsns_addUploadForm(0, 3);"><{$smarty.const._MD_XSNS_IMAGE_ADD}></a>]
+[<a href="java script:void(0);" onclick="Xsns_addUploadForm(0);"><{$smarty.const._MD_XSNS_IMAGE_ADD}></a>]
 </div>
 
 </td>
@@ -104,7 +104,7 @@
 <input type="file" name="files[]" size="40">
 </div>
 
-<{section name=cnt loop=$mod_config.file_form_limit-count($comment.files)-1}>
+<{section name=cnt start=0 loop=$mod_config.file_form_limit-1}>
 <div id="file<{$smarty.section.cnt.iteration+1}>" style="display:none;">
 <input type="file" name="files[]" size="40">
 </div>

添付ファイルのファイル名についてですが、ファイル名はデーターベーステーブル `xsns_c_file` (xsns はモジュールディレクトリ名) の `org_filename` カラムに PHP の rawurlencode() 関数でエンコードされた状態で格納されています。

以前の環境は EUC-JP 環境とのことですので、`org_filename` カラムのデータを rawurldecode() 関数に通すと EUC-JP のファイル名が得られます。得られたファイル名を UTF-8 に変換して rawurlencode() 関数へ通し得られた値で `org_filename` カラムを上書きすることで修正できます。

まずは、ご参考まで。

Re: xsns 1.14 の文字化け 
投稿者: nao-pon | 投稿日時: 2015/8/29 13:47 | 親コメント: #21528
nao-pon

EUC-JP 環境での添付ファイルのファイル名データのままでも、できるだけ文字化けしないような方法にしてみました。ただし、文字エンコーディングの自動判定を行なっているので、以前のデータの文字化けが残ったり、新しいデータの分が文字化けを起こしたりする可能性がありますので、最善の方法はデータベースデータを前述の方法で修正し、このプリロードを使わない方法になります。

まず、次の PHP ファイルを 「encodeauto.class.php」として html/modules/xsns(インストールディレクトリ名)/preload ディレクトリに配置してください。

これで問題がなければ、リポジトリに反映し新バージョンとします。

1
2
<?php
define('XSNS_FILENAME_ENCODING_AUTO', true);

そして、次の diff でパッチをあててください。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
diff --git a/extras/html/class/smarty/plugins/modifier.mb_truncate.php b/extras/html/class/smarty/plugins/modifier.mb_truncate.php
index fac9b46..2897b63 100644
--- a/extras/html/class/smarty/plugins/modifier.mb_truncate.php
+++ b/extras/html/class/smarty/plugins/modifier.mb_truncate.php
@@ -28,7 +28,7 @@ function smarty_modifier_mb_truncate($string, $length = 80, $etc = '...', $break
 	if ($length == 0){
 		return '';
 	}
-	$encode = 'EUC-JP';
+	$encode = defined('_CHARSET')? _CHARSET : 'UTF-8';
 	
 	// decode
 	$string = preg_replace(array("/&gt;/i", "/&lt;/i", "/&quot;/i", "/&#039;/i"), array(">", "<", "\"", "'"), $string);
diff --git a/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php b/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
index fac9b46..2897b63 100644
--- a/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
+++ b/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
@@ -28,7 +28,7 @@ function smarty_modifier_mb_truncate($string, $length = 80, $etc = '...', $break
 	if ($length == 0){
 		return '';
 	}
-	$encode = 'EUC-JP';
+	$encode = defined('_CHARSET')? _CHARSET : 'UTF-8';
 	
 	// decode
 	$string = preg_replace(array("/&gt;/i", "/&lt;/i", "/&quot;/i", "/&#039;/i"), array(">", "<", "\"", "'"), $string);
diff --git a/xoops_trust_path/modules/xsns/act/admin/fileAction.php b/xoops_trust_path/modules/xsns/act/admin/fileAction.php
index 7c5054a..12c38e1 100644
--- a/xoops_trust_path/modules/xsns/act/admin/fileAction.php
+++ b/xoops_trust_path/modules/xsns/act/admin/fileAction.php
@@ -68,6 +68,12 @@ function dispatch()
 			'time' => str_replace(" ", "<br>", date('Y-m-d H:i:s', $file_info['mtime'])),
 			'active' => "checked",
 		);
+		if (defined('XSNS_FILENAME_ENCODING_AUTO') && defined('_CHARSET') && function_exists('mb_detect_encoding')) {
+			$enc = mb_detect_encoding($file_list['filename'], 'EUC-JP, UTF-8');
+			if ($enc && $enc !== _CHARSET) {
+				$file_list['filename'] = mb_convert_encoding($file_list['filename'], _CHARSET, $enc);
+			}
+		}
 		unset($author_obj);
 	}
 	
diff --git a/xoops_trust_path/modules/xsns/file.php b/xoops_trust_path/modules/xsns/file.php
index 3c00189..a621d21 100644
--- a/xoops_trust_path/modules/xsns/file.php
+++ b/xoops_trust_path/modules/xsns/file.php
@@ -62,14 +62,20 @@ if(!checkFile($path_file)){
 }
 
 $saved_filename = rawurldecode($org_filename);
+if (defined('XSNS_FILENAME_ENCODING_AUTO') && defined('_CHARSET') && function_exists('mb_detect_encoding')) {
+	$enc = mb_detect_encoding($saved_filename, 'EUC-JP, UTF-8');
+	if ($enc && $enc !== _CHARSET) {
+		$saved_filename = mb_convert_encoding($saved_filename, _CHARSET, $enc);
+	}
+}
 
 $ua = $_SERVER['HTTP_USER_AGENT'];
 
 if(strstr($ua, "MSIE") && !strstr($ua, 'Opera')){
-	$saved_filename = mb_convert_encoding($saved_filename, 'SJIS', 'EUC-JP');
+	$saved_filename = mb_convert_encoding($saved_filename, 'SJIS', _CHARSET);
 }
 else{
-	$saved_filename = mb_convert_encoding($saved_filename, 'UTF-8', 'EUC-JP');
+	$saved_filename = mb_convert_encoding($saved_filename, 'UTF-8', _CHARSET);
 }
 
 ini_set('include_path', XOOPS_TRUST_PATH.'/PEAR');
diff --git a/xoops_trust_path/modules/xsns/templates/topic_edit.html b/xoops_trust_path/modules/xsns/templates/topic_edit.html
index 4fbbfcd..8285572 100644
--- a/xoops_trust_path/modules/xsns/templates/topic_edit.html
+++ b/xoops_trust_path/modules/xsns/templates/topic_edit.html
@@ -74,7 +74,7 @@
 <{/section}>
 
 <div id="image_add">
-[<a href="java script:void(0);" onclick="Xsns_addUploadForm(0, 3);"><{$smarty.const._MD_XSNS_IMAGE_ADD}></a>]
+[<a href="java script:void(0);" onclick="Xsns_addUploadForm(0);"><{$smarty.const._MD_XSNS_IMAGE_ADD}></a>]
 </div>
 
 </td>
@@ -104,7 +104,7 @@
 <input type="file" name="files[]" size="40">
 </div>
 
-<{section name=cnt loop=$mod_config.file_form_limit-count($comment.files)-1}>
+<{section name=cnt start=0 loop=$mod_config.file_form_limit-1}>
 <div id="file<{$smarty.section.cnt.iteration+1}>" style="display:none;">
 <input type="file" name="files[]" size="40">
 </div>
diff --git a/xoops_trust_path/modules/xsns/userlib/file.class.php b/xoops_trust_path/modules/xsns/userlib/file.class.php
index ef34866..ceef912 100644
--- a/xoops_trust_path/modules/xsns/userlib/file.class.php
+++ b/xoops_trust_path/modules/xsns/userlib/file.class.php
@@ -33,6 +33,12 @@ class XsnsFile extends XsnsRoot
 			'url' => XSNS_FILE_URL.'?id='.$id,
 			'url_del' => XSNS_URL_FILE.'&file_id='.$id,
 		);
+		if (defined('XSNS_FILENAME_ENCODING_AUTO') && defined('_CHARSET') && function_exists('mb_detect_encoding')) {
+			$enc = mb_detect_encoding($ret['caption'], 'EUC-JP, UTF-8');
+			if ($enc && $enc !== _CHARSET) {
+				$ret['caption'] = mb_convert_encoding($ret['caption'], _CHARSET, $enc);
+			}
+		}
 		return $ret;
 	}
Re: xsns 1.14 の文字化け 
投稿者: avocet | 投稿日時: 2015/8/30 10:04 | 親コメント: #21529
avocet

nao-pon 様

 いつも迅速な対応ありがとうございます。
 ご指示いただいたいずれかの方法を行って見ます。

 結果は別途報告いたします。

Re: xsns 1.14 の文字化け 
投稿者: avocet | 投稿日時: 2015/8/30 23:17 | 親コメント: #21528
avocet

お世話になっています。

 まずは、こちらの方法での結果です。
パッチを当てたファイルは、以下です。diff/patch コマンドは使ったことがないので diff ファイルを参照し手動で変更しました。
 html/class/smarty/plugins/modifier.mb_truncate.php
 xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
 xoops_trust_path/modules/xsns/file.php
 xoops_trust_path/modules/xsns/templates/topic_edit.html

 データベースのエンコードの変換は出来たものと思っています。

元の質問の番号で報告します。

1.は改善しました。
2.は日本語ファイル名の表示は文字化けしなくなりました。でも何故かファイル保存のダイアログでは保存ファイル名が file.php となってしまいその名前で保存されます。データベースを元に戻すと文字化けはしますが file.php とはなりません。
3.は chrome ではOKでしたが、IE11 では文字化けしてしまいます。
4.は改善されました。

 プリロードを使った結果は明日報告します。

以上

引用:
avocetさん、こんにちは。

確かにご指摘の通りの不具合がありますね。

とりあえず、手元で修正しているものの diff を貼り付けておきますね。移行前の添付ファイルの文字化け以外は多分直っていると思います。

移行前の添付ファイルの文字化けについては、後述しますがデータベースデータの修正が必要のようです。

引用:
添付ファイルのファイル名についてですが、ファイル名はデーターベーステーブル `xsns_c_file` (xsns はモジュールディレクトリ名) の `org_filename` カラムに PHP の rawurlencode() 関数でエンコードされた状態で格納されています。

以前の環境は EUC-JP 環境とのことですので、`org_filename` カラムのデータを rawurldecode() 関数に通すと EUC-JP のファイル名が得られます。得られたファイル名を UTF-8 に変換して rawurlencode() 関数へ通し得られた値で `org_filename` カラムを上書きすることで修正できます。

まずは、ご参考まで。

Re: xsns 1.14 の文字化け 
投稿者: avocet | 投稿日時: 2015/8/31 10:19 | 親コメント: #21531
avocet

プリロードを使った結果です。

 元質問の1と4は解決しています。

2.は Chrome ではファイル名表示は文字化けせず、そのまま保存できます。IE11 ではファイル名表示は文字化けしませんが、保存のダイアログではファイル名が文字化けし、文字化けのまま保存できます。

3.は chrome ではOKでしたが、IE11 ではファイル名表示は文字化けしませんが、保存のダイアログでファイル名が文字化けします。

 Chrome では、問題ないのですが IE11 では文字化けしてしまいますね。

以上です。

引用:
お世話になっています。

 まずは、こちらの方法での結果です。
パッチを当てたファイルは、以下です。diff/patch コマンドは使ったことがないので diff ファイルを参照し手動で変更しました。
 html/class/smarty/plugins/modifier.mb_truncate.php
 xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
 xoops_trust_path/modules/xsns/file.php
 xoops_trust_path/modules/xsns/templates/topic_edit.html

 データベースのエンコードの変換は出来たものと思っています。

元の質問の番号で報告します。

1.は改善しました。
2.は日本語ファイル名の表示は文字化けしなくなりました。でも何故かファイル保存のダイアログでは保存ファイル名が file.php となってしまいその名前で保存されます。データベースを元に戻すと文字化けはしますが file.php とはなりません。
3.は chrome ではOKでしたが、IE11 では文字化けしてしまいます。
4.は改善されました。

 プリロードを使った結果は明日報告します。

以上

引用:
まずは、ご参考まで。

Re: xsns 1.14 の文字化け 
投稿者: nao-pon | 投稿日時: 2015/8/31 11:50 | 親コメント: #21532
nao-pon

ファイルをダウンロードさせるのに PEAR の HTTP/Download を利用しているのですが、このパッケージはこのところメンテナンスされておらず、ダウンロードさせるだけなら、自前でコード書いたほうがよいだろうと判断し、そのように修正してみました。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
diff --git a/extras/html/class/smarty/plugins/modifier.mb_truncate.php b/extras/html/class/smarty/plugins/modifier.mb_truncate.php
index fac9b46..2897b63 100644
--- a/extras/html/class/smarty/plugins/modifier.mb_truncate.php
+++ b/extras/html/class/smarty/plugins/modifier.mb_truncate.php
@@ -28,7 +28,7 @@ function smarty_modifier_mb_truncate($string, $length = 80, $etc = '...', $break
 	if ($length == 0){
 		return '';
 	}
-	$encode = 'EUC-JP';
+	$encode = defined('_CHARSET')? _CHARSET : 'UTF-8';
 	
 	// decode
 	$string = preg_replace(array("/&gt;/i", "/&lt;/i", "/&quot;/i", "/&#039;/i"), array(">", "<", "\"", "'"), $string);
diff --git a/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php b/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
index fac9b46..2897b63 100644
--- a/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
+++ b/xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
@@ -28,7 +28,7 @@ function smarty_modifier_mb_truncate($string, $length = 80, $etc = '...', $break
 	if ($length == 0){
 		return '';
 	}
-	$encode = 'EUC-JP';
+	$encode = defined('_CHARSET')? _CHARSET : 'UTF-8';
 	
 	// decode
 	$string = preg_replace(array("/&gt;/i", "/&lt;/i", "/&quot;/i", "/&#039;/i"), array(">", "<", "\"", "'"), $string);
diff --git a/xoops_trust_path/modules/xsns/act/admin/fileAction.php b/xoops_trust_path/modules/xsns/act/admin/fileAction.php
index 7c5054a..12c38e1 100644
--- a/xoops_trust_path/modules/xsns/act/admin/fileAction.php
+++ b/xoops_trust_path/modules/xsns/act/admin/fileAction.php
@@ -68,6 +68,12 @@ function dispatch()
 			'time' => str_replace(" ", "<br>", date('Y-m-d H:i:s', $file_info['mtime'])),
 			'active' => "checked",
 		);
+		if (defined('XSNS_FILENAME_ENCODING_AUTO') && defined('_CHARSET') && function_exists('mb_detect_encoding')) {
+			$enc = mb_detect_encoding($file_list['filename'], 'EUC-JP, UTF-8');
+			if ($enc && $enc !== _CHARSET) {
+				$file_list['filename'] = mb_convert_encoding($file_list['filename'], _CHARSET, $enc);
+			}
+		}
 		unset($author_obj);
 	}
 	
diff --git a/xoops_trust_path/modules/xsns/file.php b/xoops_trust_path/modules/xsns/file.php
index 3c00189..82e5149 100644
--- a/xoops_trust_path/modules/xsns/file.php
+++ b/xoops_trust_path/modules/xsns/file.php
@@ -63,27 +63,42 @@ if(!checkFile($path_file)){
 
 $saved_filename = rawurldecode($org_filename);
 
-$ua = $_SERVER['HTTP_USER_AGENT'];
-
-if(strstr($ua, "MSIE") && !strstr($ua, 'Opera')){
-	$saved_filename = mb_convert_encoding($saved_filename, 'SJIS', 'EUC-JP');
-}
-else{
-	$saved_filename = mb_convert_encoding($saved_filename, 'UTF-8', 'EUC-JP');
+if (defined('_CHARSET')) {
+	if (defined('XSNS_FILENAME_ENCODING_AUTO') && function_exists('mb_detect_encoding')) {
+		$enc = mb_detect_encoding($saved_filename, 'EUC-JP, UTF-8');
+		if ($enc && $enc !== _CHARSET) {
+			$saved_filename = mb_convert_encoding($saved_filename, _CHARSET, $enc);
+		}
+	}
+	if (_CHARSET !== 'UTF-8') {
+		$saved_filename = mb_convert_encoding($saved_filename, 'UTF-8', _CHARSET);
+	}
 }
 
-ini_set('include_path', XOOPS_TRUST_PATH.'/PEAR');
-if(include_once('HTTP/Download.php')){
-	$download = new HTTP_Download();
-	$download->setFile($path_file);
-	$download->setCache(false);
-	$download->setContentDisposition(HTTP_DOWNLOAD_ATTACHMENT, $saved_filename);
-	$download->setContentType('application/octet-stream');
-	$download->send();
-}
-else{
-	header("Location: ".XOOPS_URL);
+$ua = $_SERVER['HTTP_USER_AGENT'];
+$filenameEncoded = rawurlencode($saved_filename);
+if (strpos($filenameEncoded, '%') === false) { // ASCII only
+	$filename = 'filename="'.$saved_filename.'"';
+} else {
+	if (preg_match('/MSIE [4-8]/', $ua)) { // IE < 9 do not support RFC 6266 (RFC 2231/RFC 5987)
+		$filename = 'filename="'.$filenameEncoded.'"';
+	} elseif (strpos($ua, 'Chrome') === false && strpos($ua, 'Safari') !== false && preg_match('#Version/[3-5]#', $ua)) { // Safari < 6
+		$filename = 'filename="'.str_replace('"', '', $saved_filename).'"';
+	} else { // RFC 6266 (RFC 2231/RFC 5987)
+		$filename = 'filename*=UTF-8\'\''.$filenameEncoded;
+	}
 }
+
+header('Content-Type: application/force-download');
+header('Content-Disposition: attachment; '.$filename);
+header('Content-Transfer-Encoding: binary');
+header('Content-Length: '.filesize($path_file));
+header('Connection: close');
+
+while(@ob_get_level()){ ob_end_clean(); }
+
+readfile($path_file);
+
 exit();
 
 //------------------------------------------------------------------------------
diff --git a/xoops_trust_path/modules/xsns/templates/topic_edit.html b/xoops_trust_path/modules/xsns/templates/topic_edit.html
index 4fbbfcd..8285572 100644
--- a/xoops_trust_path/modules/xsns/templates/topic_edit.html
+++ b/xoops_trust_path/modules/xsns/templates/topic_edit.html
@@ -74,7 +74,7 @@
 <{/section}>
 
 <div id="image_add">
-[<a href="java script:void(0);" onclick="Xsns_addUploadForm(0, 3);"><{$smarty.const._MD_XSNS_IMAGE_ADD}></a>]
+[<a href="java script:void(0);" onclick="Xsns_addUploadForm(0);"><{$smarty.const._MD_XSNS_IMAGE_ADD}></a>]
 </div>
 
 </td>
@@ -104,7 +104,7 @@
 <input type="file" name="files[]" size="40">
 </div>
 
-<{section name=cnt loop=$mod_config.file_form_limit-count($comment.files)-1}>
+<{section name=cnt start=0 loop=$mod_config.file_form_limit-1}>
 <div id="file<{$smarty.section.cnt.iteration+1}>" style="display:none;">
 <input type="file" name="files[]" size="40">
 </div>
diff --git a/xoops_trust_path/modules/xsns/userlib/file.class.php b/xoops_trust_path/modules/xsns/userlib/file.class.php
index ef34866..ceef912 100644
--- a/xoops_trust_path/modules/xsns/userlib/file.class.php
+++ b/xoops_trust_path/modules/xsns/userlib/file.class.php
@@ -33,6 +33,12 @@ class XsnsFile extends XsnsRoot
 			'url' => XSNS_FILE_URL.'?id='.$id,
 			'url_del' => XSNS_URL_FILE.'&file_id='.$id,
 		);
+		if (defined('XSNS_FILENAME_ENCODING_AUTO') && defined('_CHARSET') && function_exists('mb_detect_encoding')) {
+			$enc = mb_detect_encoding($ret['caption'], 'EUC-JP, UTF-8');
+			if ($enc && $enc !== _CHARSET) {
+				$ret['caption'] = mb_convert_encoding($ret['caption'], _CHARSET, $enc);
+			}
+		}
 		return $ret;
 	}

前回からの変更分は xoops_trust_path/modules/xsns/file.php のみです。

修正済みファイルを便宜的にこちらに置いておきます。

ご確認ください。

尚、データベースのデータを UTF-8 の URLエンコード値に変更したのであれば、プリロードファイルは撤去しても大丈夫です。

引用:
プリロードを使った結果です。

 元質問の1と4は解決しています。

2.は Chrome ではファイル名表示は文字化けせず、そのまま保存できます。IE11 ではファイル名表示は文字化けしませんが、保存のダイアログではファイル名が文字化けし、文字化けのまま保存できます。

3.は chrome ではOKでしたが、IE11 ではファイル名表示は文字化けしませんが、保存のダイアログでファイル名が文字化けします。

 Chrome では、問題ないのですが IE11 では文字化けしてしまいますね。

以上です。

Re: xsns 1.14 の文字化け 
投稿者: avocet | 投稿日時: 2015/8/31 11:53 | 親コメント: #21532
avocet

プリロードを使わない方法で再挑戦しました。

 先に実施したものは、データベースのエンコードに失敗していました。rawurlencode() を実施する際、実ファイル名のリストをファイルに一行一件で作成しましたが、行末に改行コードが入り、これがファイルの拡張子の後に "%0A" として付加されてしまい、実ファイル名と違ってしまいました。このため保存のダイアログでファイル名が file.php となってしまったようです。

 ただし、この場合も IE11 では保存のダイアログで文字化けします。
 恐れ入りますが IE11 への対応よろしくお願いいたします。

引用:
引用:
パッチを当てたファイルは、以下です。diff/patch コマンドは使ったことがないので diff ファイルを参照し手動で変更しました。
 html/class/smarty/plugins/modifier.mb_truncate.php
 xoops_trust_path/libs/smarty/plugins/modifier.mb_truncate.php
 xoops_trust_path/modules/xsns/file.php
 xoops_trust_path/modules/xsns/templates/topic_edit.html
 データベースのエンコードの変換は出来たものと思っています。

元の質問の番号で報告します。

1.は改善しました。
2.は日本語ファイル名の表示は文字化けしなくなりました。でも何故かファイル保存のダイアログでは保存ファイル名が file.php となってしまいその名前で保存されます。データベースを元に戻すと文字化けはしますが file.php とはなりません。
3.は chrome ではOKでしたが、IE11 では文字化けしてしまいます。
4.は改善されました。

 プリロードを使った結果は明日報告します。

以上

引用:
まずは、ご参考まで。

Re: xsns 1.14 の文字化け 
投稿者: nao-pon | 投稿日時: 2015/8/31 14:27 | 親コメント: #21534
nao-pon
引用:
 ただし、この場合も IE11 では保存のダイアログで文字化けします。
 恐れ入りますが IE11 への対応よろしくお願いいたします。

一つ上の投稿の修正分で直っていると思います。ご確認ください。

http://xoopscube.jp/forum/7242?comment_id=21533#comment21533

Re: xsns 1.14 の文字化け 
投稿者: avocet | 投稿日時: 2015/8/31 15:56 | 親コメント: #21535
avocet

nao-pon 様

 ありがとうございます。
文字化け、直っています。
 お忙しい中お付き合いいただき本当にありがとうございました。

 また、何かあるかもしれませんがよろしくお願いいたします。

引用:
引用:
 ただし、この場合も IE11 では保存のダイアログで文字化けします。
 恐れ入りますが IE11 への対応よろしくお願いいたします。

一つ上の投稿の修正分で直っていると思います。ご確認ください。

http://xoopscube.jp/forum/7242?comment_id=21533#comment21533

Re: xsns 1.14 の文字化け 
投稿者: nao-pon | 投稿日時: 2015/9/1 10:40 | 親コメント: #21536
nao-pon

動作確認ありがとうございます。

リポジトリを更新し、xsns version 1.15.0 としました。

    投票(0)

    新しいものから | 古いものから | RSS feed
     
    To Top