JavaScript-如何检测发往后台的文本的编码格式?

WP主题Bug提交 WP主题Bug提交 主题:1067 回复:2226

JavaScript-如何检测发往后台的文本的编码格式?

清晨说ぺ晚安 发布于 2016-10-23 字数 288 浏览 1230 回复 3

问题是这样的:
页面的编码格式是utf-8,后台需要接受gbk格式,所以前端在发送前使用iconv对utf-8做了转换。

但是碰到一个问题,如果用户修改了前端页面的编码,比如改为gb2312,然后发起请求,程序会将gb2312文本当做utf8转为gbk发给后台,然后就会是一串乱码。

如何解决这个问题

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

浮生未歇 2017-09-16 3 楼

有两种方式:
1.服务端探测请求参数的编码,你可以使用firfox的字符集探测算法,探测字节流的编码格式,有Java版本的也有C++版本的,Java版本导入的jar包名称为jcahrdet.jar,使用方法如下:

import java.io.IOException;
import java.io.InputStream;

import org.mozilla.intl.chardet.nsDetector;
import org.mozilla.intl.chardet.nsICharsetDetectionObserver;

/**

  • 与编码相关的工具类

  • @author Administrator

  • */
    public class CharsetUtil {

    private static boolean found = false;

    private static String encoding = "";
    /**

    • @param stream

    • @param languageHint

    • 语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese;*         

    •    4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default)

    • @return
      */
      public static String getStreamEncoding(InputStream stream , int languageHint){

      nsDetector detector = new nsDetector(languageHint);
      detector.Init(new nsICharsetDetectionObserver(){
      public void Notify(String charset) {
      found = true;
      encoding = charset;
      }
      });
      byte[] buf = new byte[1024];
      int len;
      boolean done = false;
      boolean isAscii = true;

      try {
      while((len=(stream.read(buf))) != -1 ){
      if(isAscii)
      isAscii = detector.isAscii(buf, len);
      if(!isAscii && !done)
      done = detector.DoIt(buf, len, false);
      if(done) break;
      }
      detector.DataEnd();
      if(isAscii){
      encoding="ASCII";
      found = true;
      }
      if(!found){
      String[] probable = detector.getProbableCharsets();
      if(probable != null && probable.length >= 1){
      encoding = probable[0];
      }
      else{
      return "gb2312";
      }
      }

      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }

      return encoding ;
      };
      }

2.客户端保证,确保浏览器改变不了查看的编码,使用js达到这种效果,不过一担客户端禁止了js就无效了。
参见:http://www.yslow.net/show.php?tid=104

归属感 2017-07-18 2 楼

通过javascript控制,保证发送前使用encodeURIComponent或encodeURI对中文进行编码,两个函数的区别可google

想挽留 2016-10-26 1 楼

具体得看你使用的语言,比如在java中可以这样来做:

public class CnCharsetChecker {
/ Support for Chinese(GB2312) characters /
// #define isgb2312head(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xf7)
// #define isgb2312tail(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe)
public static boolean isGB2312( byte head,byte tail ){
int iHead = head & 0xff;
int iTail = tail & 0xff;
return ((iHead>=0xa1 && iHead<=0xf7 &&
iTail>=0xa1 && iTail<=0xfe) ? true : false);
}
/ Support for Chinese(GBK) characters /
// #define isgbkhead(c) (0x81<=(uchar)(c) && (uchar)(c)<=0xfe)
// #define isgbktail(c) ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e)
// || (0x80<=(uchar)(c) && (uchar)(c)<=0xfe))
public static boolean isGBK( byte head,byte tail ){
int iHead = head & 0xff;
int iTail = tail & 0xff;
return ((iHead>=0x81 && iHead<=0xfe &&
(iTail>=0x40 && iTail<=0x7e ||
iTail>=0x80 && iTail<=0xfe)) ? true : false);
}
/ Support for Chinese(BIG5) characters /
// #define isbig5head(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xf9)
// #define isbig5tail(c) ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e)
// || (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe))
public static boolean isBIG5( byte head,byte tail ){
int iHead = head & 0xff;
int iTail = tail & 0xff;
return ((iHead>=0xa1 && iHead<=0xf9 &&
(iTail>=0x40 && iTail<=0x7e ||
iTail>=0xa1 && iTail<=0xfe)) ? true : false);
}

public static void main(String[] args){   
    String sGB = "爱";   
    String sGBK = "愛";   
    String sBIG5 = "稲";   
    byte[] sChars = null;   
    sChars = sGB.getBytes();   
    System.out.println(sGB+" is "+   
        CnCharsetChecker.isGB2312(sChars[0],sChars[1])+" for GB2312;"+   
        CnCharsetChecker.isGBK(sChars[0],sChars[1])+" for GBK,"+   
        CnCharsetChecker.isBIG5(sChars[0],sChars[1])+" for BIG5");   
    sChars = sGBK.getBytes();   
    System.out.println(sGBK+" is "+   
        CnCharsetChecker.isGB2312(sChars[0],sChars[1])+" for GB2312;"+   
        CnCharsetChecker.isGBK(sChars[0],sChars[1])+" for GBK,"+   
        CnCharsetChecker.isBIG5(sChars[0],sChars[1])+" for BIG5");   
    sChars = sBIG5.getBytes();   
    System.out.println(sBIG5+" is "+   
        CnCharsetChecker.isGB2312(sChars[0],sChars[1])+" for GB2312;"+   
        CnCharsetChecker.isGBK(sChars[0],sChars[1])+" for GBK,"+   
        CnCharsetChecker.isBIG5(sChars[0],sChars[1])+" for BIG5");   
}   

}

连接:http://blog.csdn.net/caesar525/article/details/2070844