jsGears.com 技術論壇 - AJAX, JavaScript, jQuery, 網站開發, 前端效能優化's Archiver

bau720123 發表於 2009-3-10 12:24

各位大大好
我最近也在研究這個MOD
我的實驗環境
PHP+MYSQL(全採UTF-8編碼)

方法一(寫死)
在HTML的陣列裡面取資料

方法二(寫死)
透過AJAX取得你的動態檔案(php..asp..)
(但實際上還是把HTML的陣列資料放到php..asp..檔案而已)

方法三(自創)(從資料庫取得資料)
目前我碰到一些問題--假設資料庫有下列5筆資料
a許功蓋
a許不蓋
a許大概
許功蓋
許小蓋

當我在文字框中輸入a時--會出現(開頭是英文都沒問題)
a許功蓋
a許不蓋
a許大概
讓我選取--當選娶某一個值時--pop警告視窗也會說我抓到了正確的值

但(開頭是中文就會有問題)
當我打'許'而已時--卻不會出現
許功蓋
許小蓋
讓我選取--取而代之的是錯誤訊息Illegal mix of collations (utf8_general_ci,IMPLICIT) and (big5_chinese_ci,COERCIBLE) for operation 'like'
很明顯這是編碼錯誤造成欄位資料無法匹配的問題--有兩個解決辦法
方法A:將資料庫中匹配欄位的那個屬性改成big5_chinese_ci(utf8_general_ci是我原來的)
方法B:將
var url = options.url + "?q=" + encodeURI(q);
url += "&" + i + "=" + encodeURI(options.extraParams[i]);
分別改成
var url = options.url + "?q=" + escape(q);
url += "&" + i + "=" + escape(options.extraParams[i]);
就不會出現上述問題

這次我再打'許'或任何開頭中文的字--少了錯誤訊息--但還是沒出現應該要出現的選項--什麼都沒發生
請問有沒有人有這方面的相關實例
希望各位多指教

wmh 發表於 2009-3-10 12:58

看起來是資料庫編碼的問題,和 jQuery 無關。
如果都是 utf-8 的編碼,應該不會有上述的問題,你可以試著先在 server 端的 php 程式把正確的資料撈出來後,再來套前端的 UI。

你去資料庫撈資料的語法是自己寫的嗎?
會不會在開啟資料庫連線後忘了指定編碼:
[code php]mysql_query('SET NAMES utf8');[/code]

bau720123 發表於 2009-3-10 13:45

是的
全部都是utf-8編碼
mysql_query('SET NAMES big5' );
mysql_query("SET NAMES utf8' );
我都試過了--不過都是一樣的狀況
我可否把我的檔案跟資料庫結構傳一份給您
您幫我看看好嗎
因為我研究真的研究了很久了
就是中文首字問題沒法解決
如果可以的話--看是傳MAIL或是連結都可^^||

DEMO網址如下
[url]http://59.124.2.38/autocomplete/autocomplete.html[/url]

[[i] 本帖最後由 bau720123 於 2009-3-10 15:05 編輯 [/i]]

wmh 發表於 2009-3-10 20:19

ok 你可以用網頁最下面的「聯繫我們 」的 email,或是你把檔案放到某個地方,再用「發短消息」的功能傳送給我即可,我會試著幫你看一下問題在哪。

bau720123 發表於 2009-3-10 20:34

信件已寄出
內有完整使用說明
輸入資料時
可以隨便打a or c or d or 包 or 許
等字串
現在英文是OK的~中文就如您所知到的狀況一樣
再次感謝

wmh 發表於 2009-3-10 21:12

我發現資料傳到 server 端會被編碼,
許功蓋會變成 "%u8A31%u529F%u84CB" 的字串,
所以要再用以下的方式取為原字串:

[code php]
$q = join('', json_decode('["'. strtr($_GET['q'], '%u', '\u') . '"]'));
[/code]

bau720123 發表於 2009-3-11 12:17

目前我把網頁也變成了UTF-8
php,ini裡面也設定default_charset = "UTF-8"
以下是在不同的程式語法下測試的狀況
也麻煩您再幫我看一次
測試環境--自己電腦上的瀏覽器(IE跟FF)

您的意思是說把
$q = strtolower($_GET["q"]);
替換成
$q = join('', json_decode('["'. strtr($_GET['q'], '%u', '\u') . '"]'));


但結果在伺服器上沒什麼變化ㄟ
我準備了兩個版本
autocomplete_ajax.php是沿用原來的$q = strtolower($_GET["q"]);
autocomplete_ajax1.php是沿用新的$q = join('', json_decode('["'. strtr($_GET['q'], '%u', '\u') . '"]'));

包=
[url]http://59.124.2.38/autocomplete/autocomplete_ajax.php?q=包[/url]
[url]http://59.124.2.38/autocomplete/autocomplete_ajax.php?q=%A5][/url]
[url]http://59.124.2.38/autocomplete/autocomplete_ajax1.php?q=包[/url]
[url]http://59.124.2.38/autocomplete/autocomplete_ajax1.php?q=%A5][/url]

許=
[url]http://59.124.2.38/autocomplete/autocomplete_ajax.php?q=許[/url]
[url]http://59.124.2.38/autocomplete/autocomplete_ajax.php?q=%B3\[/url]
[url]http://59.124.2.38/autocomplete/autocomplete_ajax1.php?q=許[/url]
[url]http://59.124.2.38/autocomplete/autocomplete_ajax1.php?q=%B3\[/url]

前台測試網址
[url]http://59.124.2.38/autocomplete/autocomplete.html[/url]
[url]http://59.124.2.38/autocomplete/autocomplete1.html[/url]

[[i] 本帖最後由 bau720123 於 2009-3-11 12:27 編輯 [/i]]

wmh 發表於 2009-3-11 21:21

我把我目前可運作的程式完整寄回給你看看。
所有的檔案資料都以 UTF-8 來做,
包含你原本的 autocomplete.html 也轉成 UTF-8 編碼。

bau720123 發表於 2009-3-12 10:51

我收到您的來信了
真的可以執行了
中文首字偵測也沒問題
我大概知道我哪些地方跟您這個版本設定的不一樣之處了
最後一個小問題希望您能給我一些建議

像打英文時--比方'a'--打完的那一剎那它自己會感應出應對的資料
但中文似乎有點兩光--比方打完'包'時--資料不會立即出來
這時要鍵盤上的方向鍵左或右動一下--這時才會感應出應對的資料
這跟字元碼有什麼相關的因素影響嗎???
希望能聽聽看您的看法跟建議
然後我再朝那個方向先自行去研究
真的不行時再上來論壇請教
再次謝謝您

PS
後記
後來我發現這個狀況目前在FF才會有這樣的狀況
IE我的版本是6是會立即自動感應的

[[i] 本帖最後由 bau720123 於 2009-3-12 11:35 編輯 [/i]]

wmh 發表於 2009-3-12 13:12

中文輸入的部份,可能和輸入法有關係喔,我這邊看起來是都還蠻順的,不會需要左右鍵動一下才出現資料。我是用酷音和雅虎奇摩輸入法,兩個都正常。

wmh 發表於 2009-3-14 15:39

很明顯啊,你的問題出在輸入時不是用 \n 換行,而是用 html 的 <br/> 換行:
[code vb]
Response.Write(data[a] + "<br/>");
[/code]

上面這一行應該改成:
[code vb]
Response.Write(data[a] + "\n");
[/code]

bau720123 發表於 2009-3-16 13:14

了解謝謝您低說明
再次感謝

jordenno 發表於 2009-3-16 13:29

使用JSP提供資料

大大你好,我是用JSP提供資料
JSP檔如下程式碼

接收頁可以顯示資料沒問題
但當我在輸入框輸入 a 時
應該是只有出現2個選項
不過卻四個選項都出來了
繼續再輸入 b
又變成只剩一個選項了(abc)
有人用jsp來提供資料,有問題的嗎??[code]<%@ page contentType="text/html; charset=big5" language="java" errorPage="" %>
<%
         out.print("abc\n");
         out.print("babc\n");
         out.print("cabc\n");
         out.print("aabc\n");       
%>[/code]

wmh 發表於 2009-3-16 16:42

server 端用哪種語言應該都不是問題喔,只要正確地將資料一行一行輸出即可。

你要貼出比較完整的程式碼嗎?上面這一段看不太出來問題在哪。

redapple_pj 發表於 2009-4-11 16:02

管理员,这个问题怎么解决呀?一直没搞好

按照jquery中的实例做的,jsp页面中的javascript上:[code]$().ready(function() {
      $("#home_address").autocomplete('getJdtype.do', {
                minChars: 0,
                width: 310,

                matchContains: true,
                autoFill: false,
                formatItem: function(row, i, max) {
                        return i + "/" + max + ": \"" + row.name + "\" [" + row.to + "]";
                },
                formatMatch: function(row, i, max) {
                        return row.name + " " + row.to;
                },
                formatResult: function(row) {
                        return row.to;
                }
        });
}[/code]控制器中:[code]public void getJdtype(HttpServletRequest request,
                        HttpServletResponse response) throws Exception {
                String parent = request.getParameter("q");
                //int count=0;
                String str = "";
                List<Map> list;
               
                if(StringUtils.isBlank(parent)){
                        //count=0;
                        //str=String.valueOf(count);
                        return;
                }else{
                        list = getTDkindByTG(Integer.valueOf(parent));
                        //count=list.size();
                        //str=String.valueOf(count);
                        for(Map map :list){
                                String name=String.valueOf(map.get("kindremark"));
                                String id=String.valueOf(map.get("acceptdkindid"));
                                str += "{ name: \""+name+"\", to: \""+id+"\" },\n";
                        }
                }
                str = "[" + str + "]";
                System.out.println(str);
                response.setContentType("text/html;charset=UTF-8");
                response.setHeader("Cache-Control", "no-cache");
                response.getWriter().write(str);
        }[/code]页面显示部分,总是提示“undefined”
我在页面中直接调试http://localhost:8088/project/getJdtype.do?q=4
显示的内容为:
[{ name: "催促揽", to: "13" }, { name: "催送发票(底单)", to: "38" }, { name: "催送单", to: "39" }, { name: "(底单)", to: "43" }, ]

是不是要显示成数组形式,而不是字符串呢,但动态数组不知道各位是如何实现的。盼。。。。。。

wmh 發表於 2009-4-12 00:05

我看了一下實做的內容,有兩個地方需要調整,第一個是 server 端輸出的資料,要改成一行一組資料的方式:[code]{ name: "催促揽", to: "13" }
{ name: "催送发票(底单)", to: "38" }
{ name: "催送单", to: "39" }
{ name: "(底单)", to: "43" }[/code]再來是 client 端的部份,接到的 row 必須再處理一次:

[code js]
                formatItem: function(row, i, max) {  
                        var row = eval('(' + row + ')');
                        return i + "/" + max + ": \"" + row.name + "\" [" + row.to + "]";  
                },  
                formatMatch: function(row, i, max) {  
                        var row = eval('(' + row + ')');
                        return row.name + " " + row.to;  
                },  
                formatResult: function(row) {  
                        var row = eval('(' + row + ')');
                        return row.to;  
                }  
[/code]

這樣應該就可以囉...

terry.lin 發表於 2009-6-11 15:48

回復 50# 的帖子

DEAR 版大:
我也遇到相同的問題,但是我是用jsp & servlet來做的,
我的進度到了#41,用英文都沒有問題,但是用中文的話,
在後端就變成會得到???的值,
因為看bau720123已經解決了,
但是我對php不熟,所以不知道您寫的那一段是在做什麼?如下:
能否幫我解決這個問題,感恩!

$q = join('', json_decode('["'. strtr($_GET['q'], '%u', '\u') . '"]'));

wmh 發表於 2009-6-11 19:21

[code php]
$q = join('', json_decode('["'. strtr($_GET['q'], '%u', '\u') . '"]'));[/code]

這一段是:
[list=1]
[*]先取得 GET 傳來的 q 這個變數
[*]把 %u 轉成 /u
[*]然後前後加上方括號
[*]將 JSON 轉回 Array
[*]再把 Array 接起來轉回字串
[/list]

你可以在 [url]http://json.org/[/url] 取得 Java 處理 JSON 的 class

terry.lin 發表於 2009-6-12 09:22

回復 60# 的帖子

謝謝大大,已經可以了!:lol

niplover 發表於 2009-7-20 19:33

wmh,您好,我使用jquery autocomplete的時候碰到了一點問題。

代碼如下:


<link rel="stylesheet" href="/5xun5mi/css/jquery.autocomplete.css" type="text/css"></link>
                <script src="http://www.google.com/jsapi" ></script>  
                <script language="javascript" type="text/javascript" >  
                        google.load("jquery", "1");
                </script>
                <script type="text/javascript" src="/5xun5mi/js/jquery.autocomplete.js" defer="defer" charset="GBK"></script>
               


<script language="javascript" type="text/javascript" charset=GBK>
   [color=Red]  $("#searchtext").autocomplete("/5xun5mi/jsp/get_tip_data.jsp");[/color]
</script>


在[color=Red]IE[/color]中運行時,總是提示紅色標注的哪行有錯,[color=Red]錯誤信息是:對象不支持此屬性或方法[/color]。

然而在Firefox中運行是正常的,其錯誤控制台也沒有任何錯誤信息。

望wmh指教,謝謝!

頁: 1 2 [3] 4 5 6 7

Powered by Discuz! Archiver  © 2001-2009 Comsenz Inc.