还有,运行在client side, 偶知道WinNT Server可以做,
别提这个Server.

解决方案 »

  1.   

    1、GBK是gb2312的扩充,做Unicode编码时兼容了big5。排列上已无规律可循,只有使用字典。
    2、切换页面的语言,可在页面输出是做编码转换。但要自己用js去访问系统的dll,意义不大。
    3、只有gb2312的一级字库是按拼音排序的(二级库按偏旁部首),所以若要拼音排序需解析系统的拼音输入法字典
      

  2.   

    谢谢回音。GB2312确实只有一级字库3000多汉字是按拼音排列的。加上GB2312的二级字库和GBK的两次扩充,共20902个汉字是有拼音的。Unicode还有另外7000来个汉字没有拼音,这些汉字来自日文和韩文。偶觉得不一定要解析系统拼音输入法字典。偶觉得数据库Jet引擎可以利用一下,即先将要排序的汉字数组保存成文本文件,用ADO以数据库方式读取排序。
    这样做有两个缺点,一是需要访问客户机文件系统,二是仍然没有得到GBK编码。欢迎讨论。
      

  3.   

    考察下面这个名为"codetest.htm"的页面,出现在search区域的是?kkk=%D6%D0%CE%C4,这是正确的GB2312编码即GBK码,而打印在body里的是%E4%B8%AD%E6%96%87 UTF-8码。谁还有什么好建议,不用生成get参数的方法就得到该死的D6D0?<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    </head>
    <body>
    <script>
    document.write(encodeURI("中文"))
    </script>
    <form method=get action='codetest.htm'>
    <input name=kkk value='中文' type=text>
    <input type=submit value='submit'>
    </form>
    </body></html>
      

  4.   

    http://www.blueidea.com/user/qswh/gb2312.html
      

  5.   

    就是指函数UrlEncode()调用了自定义词典
      

  6.   

    折衷点说,如何访问Code Page 936?
      

  7.   

    你自己也知道由于历史的原因,gbk与unicode间无规律可循。
    所以必须使用字典,现在所能见到的程序、控件包括ie本身都是通过查表的。况且查表是计算机的强项。
    若需要对照表,请给我留言。
      

  8.   

    其实我说的是,既然IE或者说Windows自己有对照表,那就找出来用就是了,不需要自己进行加载。另外,它查表是通过底层编译过的程序,那要比用JS快很多很多。就是如何引用它的这个功能。
      

  9.   

    不错,但是用js调用系统标准的dll是不可能的。写成控件加载于客户端,可行但不可靠。
    不知你看过相关的vb代码没有?是在ocx调用系统dll的。
      

  10.   

    GBK-UNICODE的对照表可以用GBK码表,写个程序自己求出来。就是想来想去,IE已经加载了一个它的对照表,还有模块来查表;
    我为什么还要自己做一个对照表加载进去,还得写个查表程序?
    极为不爽。
      

  11.   

    没有看过,麻烦贴来看看?
    写个ActiveX调用系统dll能行也好啊。
      

  12.   

    我又用GBK码表最前面的几个字试了试:
    丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗地址栏出现:?kkk=%81@%81A%81B%81C%81D%81E%81F%81G%81H%81I%81J%81K%81L%81M%81N%81O%81P%81Q%81R%81S%81T%81U%81V%81W%81X%81Y%81Z%81%5B%81%5C好象很对号的说。 IE 用什么玩意给GET参数编码的啊?我听说人家Java在编码的时候可以写个参数如:encodeURI("中文测试","GBK");怎么JS就这么愚蠢的没有参数啊?
      

  13.   

    那不是到服务器端了吗?vbs、php、jsp都相关函数。这与客户段何干?js没有必要弄的那么复杂,不过也有escape函数的。浏览器只是再现服务器传递来的信息。
    不可能,也无必要包容那么多功能。
      

  14.   

    escape跟charCodeAt求出的东西是一回事。无非就在255以外加上了%u,
    还有就是16进制而已。
      

  15.   

    我没有说过服务器端啊???
    以下文字来自http://www.99net.net/study/prog/68103937.htm其中一句InputStreamReader (bin,"GBK"));
    让偶很愤怒,他凭什么可以加参数!!!???!!!!
    Java从一个byte流中读取一个字符串时,将把平台相关的byte转变为平台无关的Unicode字符串。在输出时Java将把Unicode字符串转变为平台相关的byte流,如果某个Unicode字符在某个平台上不存在,将会输出一个'?'。举个例子:在中文Windows中,Java读出一个"GB2312"编码的文件(可以是任何流)到内存中构造字符串对象,将会把GB2312编码的文字转变为Unicode编码的字符串,如果把这个字符串输出又将会把Unicode字符串转化为GB2312的byte流或数组:"中文测试"----->"\u4e2d\u6587\u6d4b\u8bd5"----->"中文测试"。
    如下例程:
    byte[] bytes = new byte[]{(byte)0xd6, (byte)0xd0, (byte)0xce, (byte)0xc4, (byte)0xb2, (byte)0xe2, (byte)0xca, (byte)0xd4};//GBK编码的"中文测试"
    java.io.ByteArrayInputStream bin = new java.io.ByteArrayInputStream(bytes);
    java.io.BufferedReader reader = new java.io.BufferedReader(new java.io. InputStreamReader (bin,"GBK"));
    String msg = reader.readLine();
    System.out.println(msg)
      这段程序放到包含"中文测试"这四个字的系统(如中文系统)中,可以正确地打印出这些字。msg字符串中包含了正确的"中文测试"的Unicode编码:"\u4e2d\u6587\u6d4b\u8bd5",打印时转换为操作系统的默认字符集,是否可以正确显示依赖于操作系统的字符集,只有在支持相应字符集的系统中,我们的信息才能正确的输出,否则得到的将会是垃圾。
      

  16.   

    是服务器端啊,肯定不适合在这个版面讨论了。jsp专门有讨论区。不用jsp弄个控件或cgi也很容易,一搜一大把。
      

  17.   

    To:xuzuning(唠叨) 我想你不是很明白我在说什么。
    B/S结构的的应用程序(包括JS程序)必须部署到客户端,以减轻服务端压力。
    很明显的,假如同时对一万台客户机提供服务,就是说服务器同时响应一万个客户请求。
    假如你用的是一台SUN服务器,我用一台PC。你的服务器速度比我的快100倍,当然了,我相信价格可能就不止100倍了。可是同时我拥有那一万台处理器的能力,而你没有使用。
    例如你的服务器处理一个数据请求花费10毫秒+传送=0.1毫秒,这样队列中最后一个客户被响应的时间为10000*10.1/1000=101秒。就是一分半钟以上。
    你不能指望你那著名的SUN在数据传送上比偶的可怜的PC强到哪里去,就算它快10倍,偶的传送要花1毫秒。偶的响应时间为10000*1/1000=10秒。况且偶认为在这个传送时间上强大的服务器并没有传说中的那么强大的优势,不是10倍而是差不多。
    假定客户使用同样的破烂PC,数据在客户端的处理时间是1秒,这样最后一个最终用户看到显示的时间不超过11秒。偶相信没有人会在那里等上1分半钟直到你强大的SUN腾出那么点时间响应他。
      

  18.   

    再来看看这段人家的Delphi程序:
    看这一句:
    if (Ord(stText[i]) >= 129) and (Ord(stText[i + 1]) >= 64)Delphi居然把单个字符读为两段,按照字节来读,汉字为双字节。Ord函数返回的是GBK位置。
    JS把汉字读为一个字符。这TMD的是省事了,就是不知道如何快速转回去算。-------------------------------------------------------
    function MakeSpellCode(stText: string; iMode, iCount: Integer): string;
    var
      i, Index: integer;
      APy, ls_code: string;
      fFlag1, fFlag2, fFlag3: Boolean;
    begin
      fFlag1 := (iMode and $0001) = 1;
      fFlag2 := (iMode and $0002) = 2;
      fFlag3 := (iMode and $0004) = 4;
      Result := '';
      if iMode < 0 then Exit;
      i := 1;  while (i <= Length(stText)) do begin
        if (Ord(stText[i]) >= 129) and (Ord(stText[i + 1]) >= 64) then begin
          // 是否为 GBK 字符
          case Ord(stText[i]) of
            163: // 全角 ASCII
              begin
                APy := Chr(Ord(stText[i + 1]) - 128);
                // 控制不能输出非数字, 字母的字符
                if not fFlag3 and not (APy[1] in ['a'..'z', 'A'..'Z', '0'..'9']) then
                  APy := '';
              end;
            162: // 罗马数字
               if Ord(stText[i + 1]) > 160 then
                 APy := CharIndex[Ord(stText[i + 1]) - 160] else
                 // 在罗马数字区, 不能翻译的字符非罗马数字
                 if fFlag2 then APy := '?' else APy := '';
            166: // 希腊字母
              if Ord(stText[i + 1]) in [$A1..$B8] then
                APy := UpperCase(CharIndex2[Ord(stText[i + 1]) - $A0])
              else if Ord(stText[i + 1]) in [$C1..$D8] then
                APy := UpperCase(CharIndex2[Ord(stText[i + 1]) - $C0]);
          else // 一般汉字
            if gi_loaded = 1 then begin // 使用外挂
              // 获得拼音索引
              ls_code := IMCodes[Ord(stText[i]) - 128, Ord(stText[i + 1]) - 63].PYCode;
              if not fFlag1 then // iFlag1 = False, 是单拼音
                APy := Copy(Uppercase(ls_code), 1, 1) else
                APy := Copy(Uppercase(ls_code), 1, 6);
            end else begin // 使用内置
              // 获得拼音索引
              Index := PyCodeIndex[Ord(stText[i]) - 128, Ord(stText[i + 1]) - 63];
              if Index = 0 then // 无此汉字, 不能翻译的字符, GBK 保留
                if fFlag2 then APy := '?' else APy := ''
              else if not fFlag1 then // iFlag1 = False, 是单拼音
                APy := Copy(Uppercase(PyMusicCode[Index]), 1, 1) else
                APy := Copy(Uppercase(PyMusicCode[Index]), 1, 6);
            end;
          end;
          Result := Result + APy;
          Inc(i, 2);
        end else begin // 在 GBK 字符集外, 即半角字符
          if fFlag3 or (stText[i] in ['a'..'z', 'A'..'Z', '0'..'9']) then
            Result := Result + UpperCase(stText[i]);
          Inc(i);
        end;
      end;
      Result := Copy(Result, 1, iCount);
    end;
      

  19.   

    http://www.flea.co.nz/abc/PYDemo.htm唉,大家看看吧,应该还凑合
      

  20.   

    某些多音字的确很烦人,你必须精确地联系上下文的含义而不是仅仅依赖它在词组中的位置。
    例如“单”
    单干: dan
    单于:chan
    单县:shan
    单独:dan
      

  21.   

    如果要精确地联系上下文,偶估计多音字典会膨胀到100K左右。
    加上原有的42K单音字典和4k发音表及1K程序,总量大约在150K。对JS来说这是太大了。