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

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

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

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

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

如何解决这个问题

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

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

评论(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