最近做了下网站首页静态化,发现各个浏览器浏览效果都没中文问题。但是发现了腾讯TT和遨游一个很奇怪的问题,那就是不管TT和遨游浏览器有没有勾上自动选择,首次访问我们网站时,都没有中文问题,但是奇怪的是,等到页面打开后,我又手动的将TT和遨游的编码勾上自动选择,结果又出现中文问题,给我的感觉就是TT和遨游第一次访问我们网站时,能知道网站的编码格式(UTF-8),但是我手动勾上自动选择后,它们却又不知道了...蛮奇怪的
   虽然我觉得终端客户们,没我这么无聊,明明能正常访问了,却又去勾上自动选择...但是感觉真的很奇怪,其他IE6-IE8、火狐浏览器都是好的,不管是第一次访问还是访问网页后,又手动去改编码为自动选择,都可以。
   备注:用的UTF-8,<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />这句是加在TITLE前面。请各位大大解惑。

解决方案 »

  1.   

    应该是二者浏览器编码处理有BUG吧,呵呵,楼主测试的真详细。
      

  2.   

    花了一上午时间,居然无意间被我找到原因,给大家分享一下,同时还有个问题要问问大家。
    我怀疑TT和遨游在编码勾上自动选择的时候,会去搜索该访问的html文件的编码格式,而UTF-8有两种,一种是带BOM,一种是不带BOM,而TT和遨游只将带BOM的UTF-8格式当作是UNCODE的编码格式(真伤..居然只将带BOM当作UTF-8....),所以当我们网页是以不带BOM的UTF-8格式进行编码的话,那么不被TT和遨游的自动选择所认证。
      

  3.   

    所以还需要请教各位,java文件写入的时候,用Writer out = new OutputStreamWriter(fos, "UTF-8");可以写入UTF-8格式的文件,但是默认是不带BOM的,网上搜索半天,只有将UTF-8格式的文件去除其BOM,没有添加...请问各位java写入文件时,可以设置该文件的编码是带BOM的UTF-8么?我试过以下方法,不行,希望各位大大指教。/**  
       * 合并两个byte数组  
       * @param pByteA  
       * @param pByteB  
       * @return  
       */  
      public static byte[] getMergeBytes(byte[] pByteA, byte[] pByteB){   
          int aCount = pByteA.length;   
          int bCount = pByteB.length;   
          byte[] b = new byte[aCount + bCount];   
          for(int i=0;i<aCount;i++){   
              b[i] = pByteA[i];   
          }   
          for(int i=0;i<bCount;i++){   
              b[aCount + i] = pByteB[i];   
          }   
          return b;   
      }
     public void writeHtml(String htmlcode) {
        String mainPath = "main.html";
        try {
          FileOutputStream fos = new FileOutputStream(new File(mainPath));
          Writer out = new OutputStreamWriter(fos, "UTF-8");
          String mainHtml = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
          byte []data = new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF };
          mainHtml = new String(getMergeBytes(data,mainHtml.getBytes()));
          out.write(mainHtml);
          out.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }