`
andy_javahome
  • 浏览: 32860 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

utf-8转化成GBK 乱码(已解决)

阅读更多
问题描述:我的jsp编码是GBK 后台的web.xlm默认也是GBK,但我想用Ajax的异步提交带中文的数据(我用的是json),这样到后台解析是乱码,存入数据库也是乱码。在网上找了好多方法看到问的很多解决的却很少。
网上大多解决都是用java API自带的String的一个方法,先将字符串转化成字节,然后再转utf-8。告诉大家你看到这个帖子的时候就不用再尝试这种解决办法了,那是个美丽扯。utf-8是一个汉字三个字节,当你是奇数个汉字或汉字与字母数字混合是还是有乱码。
下面是我的解决办法。
1、在jsp中我的数据输入是用textarea装载,用js给这个标签写了一个失去焦点事件
html:
<textarea name="memotemp" rows="4" id="memotemp"></textarea>
<input type="hidden" id="memoval" name = "reason" value=""/>
js:
//textarea 失去焦点事件
$("#memotemp").blur(function(){
   var memotemp= $("#memotemp").val();
   $("#memoval").val(escape(memotemp));
});
ps: 1.var memotemp= $("#memotemp").val();意思是得到textarea 里的内容。
     2.escape(memotemp)意思是memotemp被escape转码(这里不多说escape你可以Google一下)。
      3.$("#memoval").val(escape(memotemp));意思是将转码后的内容放入id为
memoval的input里。
实际上这个id为memoval的input内容是 我们要提交给后台的。这个到后台也是一堆类似url里的那些乱码。这时候你可以用一个自己写的java方法将escape转码过的再转回原先的真实的值。这样一来你就避免了Ajax提交过程中默认编码是utf-8而你的程序中都是GBK引起的乱码问题。

下面是java代码,非小弟本人所创在网上找的。
package com.cfcc.cams.aduitmanage.util;

import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class CommonStr {
private final static String[] hex = { "00", "01", "02", "03", "04", "05",
"06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b",
"1c", "1d", "1e", "1f", "20", "21", "22", "23", "24", "25", "26",
"27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f", "30", "31",
"32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c",
"3d", "3e", "3f", "40", "41", "42", "43", "44", "45", "46", "47",
"48", "49", "4a", "4b", "4c", "4d", "4e", "4f", "50", "51", "52",
"53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d",
"5e", "5f", "60", "61", "62", "63", "64", "65", "66", "67", "68",
"69", "6a", "6b", "6c", "6d", "6e", "6f", "70", "71", "72", "73",
"74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e",
"7f", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
"8a", "8b", "8c", "8d", "8e", "8f", "90", "91", "92", "93", "94",
"95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f",
"a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa",
"ab", "ac", "ad", "ae", "af", "b0", "b1", "b2", "b3", "b4", "b5",
"b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf", "c0",
"c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb",
"cc", "cd", "ce", "cf", "d0", "d1", "d2", "d3", "d4", "d5", "d6",
"d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df", "e0", "e1",
"e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec",
"ed", "ee", "ef", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
"f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff" };
private final static byte[] val = { 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x01,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f };
public static String unescape(String s) {
StringBuffer sbuf = new StringBuffer();
int i = 0;
int len = s.length();
while (i < len) {
int ch = s.charAt(i);
if (ch == '+') {// + : map to ' '
sbuf.append(' ');
} else if ('A' <= ch && ch <= 'Z') {// 'A'..'Z' : as it was
sbuf.append((char) ch);
} else if ('a' <= ch && ch <= 'z') {// 'a'..'z' : as it was
sbuf.append((char) ch);
} else if ('0' <= ch && ch <= '9') {// '0'..'9' : as it was
sbuf.append((char) ch);
} else if (ch == '-'
|| ch == '_'// unreserved : as it was
|| ch == '.' || ch == '!' || ch == '~' || ch == '*'
|| ch == '\' || ch == '(' || ch == ')') {
sbuf.append((char) ch);
} else if (ch == '%') {
int cint = 0;
if ('u' != s.charAt(i + 1)) { // %XX : map to ascii(XX)
cint = (cint << 4) | val[s.charAt(i + 1)];
cint = (cint << 4) | val[s.charAt(i + 2)];
i += 2;
} else {// %uXXXX : map to unicode(XXXX)
cint = (cint << 4) | val[s.charAt(i + 2)];
cint = (cint << 4) | val[s.charAt(i + 3)];
cint = (cint << 4) | val[s.charAt(i + 4)];
cint = (cint << 4) | val[s.charAt(i + 5)];
i += 5;
}
sbuf.append((char) cint);
}
i++;
}
return sbuf.toString();
}
}


这次你的问题应该可以解决了,我的表达能力不太好, 这套办法解决常用编码问题是绝对可以的。
分享到:
评论

相关推荐

    UTF-8互转GBK

    UTF-8 GBK 转化工具 C++ 源代码编码转化 主要用于跨平台的源代码编译,防止乱码

    java将gbk文件批量转换成UTF-8

    在开发的时候经常碰到这样的情况,需要将原本编码格式为GBK的工程改成UTF-8来编码,设置之后,注释全都乱码了,一个一个改太麻烦,有了这个工具只用运行一下main方法,一键搞定 ps:如果是UTF-8转GBK,或是其他编码...

    Java 所有字符串转UTF-8 万能工具类-GetEncode.java

    不需要关心接受的字符串编码是UTF_8还是GBK,还是ios-8859-1,自动转换为utf-8编码格式,无需判断字符串原有编码,用法://处理编码String newStr = GetEncode.transcode(oldStr);

    实现文件在UTF-8和GBK编码格式相互切换的工具

    java -jar EncodingTool.jar "要转的文件或者整个文件夹的绝对路径或者相对路径" utf-8 (想转成gbk就写gbk) 比如 java -jar EncodingTool.jar "/code/Hello.java" utf-8 就会在当前目录生成一个新的目录 里面是...

    UTF8转GBK C语言 单片机

    基于Keil的用C语言写的UTF转GBK的代码,用的查表法,字库占用41K左右Flash,可以用于将数据流中的UTF文本转化为GBK,解决串口显示或者TF或LCD显示中文乱码的问题

    解决mp3乱码

    原因是因为我们平时用的windows系统内码一般为GBK,而android是utf-8。所以是乱码,为了解决中文标签乱码,可以使用convertZ(在附件中,可以下载)。启动后,可以使用屏幕右上角的第一个按钮,有个ID3标签工具,把...

    将字符串转换成gb2312或者utf-8编码的参数(js版)

    直接在url中传递中文参数时,读到的中文都是乱码,那么我们应该怎么将这些参数转换呢,接下来与大家分享下将字符串转换成utf-8或者gb2312编码的参数的技巧

    Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    Qt字符转换,串口接收数据转为中文显示可用。Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    gbk转UTF8.zip

    纯WIN32编写 , 将GBK编码的乱码字符串复制到上面的输入框 然后点击转换下面的输入框就会输出UTF-8的文字

    计算机基础知识-编码表.doc

    计算机基础知识-编码表 模块:计算机基础知识 主题:编码表 关键词:ASCII、Unicode、UTF-8 1、编码表 计算机发明之初,用来解决数字计算的问题,后来人们发现可以做更多的事,但由 于计算机只识" 数",因此人们必须...

    jsmartcom_utf8.jar和jsmartcom_gbk.jar两种编码方式

    jsmartcom的UTF_8和GBK两种编码方式的jar包,解决上传下载的中文乱码问题。

    Python基于codecs模块实现文件读写案例解析

    但有时,utf-8和gbk都不好使用,使用notepad++,打开有乱码;看到有小块黑色。 这时候,需要加个参数, errors=”ignore” # 读文件:含特殊字符 import codecs f = codecs.open('20.txt', 'rb',encoding='gbk', ...

    字符转化工具.rar

    用于转换字符串为utf-8、gbk等,可以用来辅助检查乱码错误,更快定位问题。有ANSI_1.85和UNICODE_2.00两个版本

    PHP转换文件夹下所有文件编码的实现代码

    PHP转换文件夹下所有文件的编码 适合发布网站的其他编码版本 比如你有一个GBK版本 你想有一个UTF8版本 或者你...$filename,$input_encoding=’gbk’,$output_encoding=’utf-8′&#41;{if(file_exists($filename)){if(is

    PHPWord中文手册.docx

    1、解决编码问题,PHPword 会对输入的文字进行utf8_encode编码转化,如果你使用GBK、GB2312或者utf8编码的话就会出现乱码,如果你用utf8编码,就查找类库中所有方法中的 utf8_encode 转码将其删除,如果你采用GBK...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    上面的例子分三级结构排列成"树"状,其中的就是根元素。在XML和DTD文件中,第一个定义的都是根元素。 3.Parent Element(父元素)/Child Element(子元素) 父元素是指包含有其它元素的元素,被包含的元素称为它的子...

    强大的php生成word ,html,rtf,pdf框架(包含中文文档)

    1、解决编码问题,PHPword 会对输入的文字进行utf8_encode编码转化,如果你使用GBK、GB2312或者utf8编码的话就会出现乱码,如果你用utf8编码,就查找类库中所有方法中的 utf8_encode 转码将其删除,如果你采用GBK...

    PHPWord中文手册

    1、解决编码问题,PHPword 会对输入的文字进行utf8_encode编码转化,如果你使用GBK、GB2312或者utf8编码的话就会出现乱码,如果你用utf8编码,就查找类库中所有方法中的 utf8_encode 转码将其删除,如果你采用GBK...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

Global site tag (gtag.js) - Google Analytics