服务器之家

服务器之家 > 正文

java转换字符串编码格式的方法

时间:2021-05-25 13:25     来源/作者:du_xian_sheng

java转换字符串编码格式 (解码错误,重新解码)

字符集概念:规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。

我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流。 

乱码场景(纯属瞎掰):

1) 前台输入utf-8编码的一串汉字(string1)。 (页面编码为utf-8, 在内存中会将这串汉字以utf-8编码为对应的二进制流存储)

2) 这串汉字(string1)的二进制流在经过http协议传输到后台时,这段比特流会被以iso-8859-1编码强行解码为字符串(string2)。

(2.1 http默认编码格式为iso-8859-1)

(2.2 这个默认编码在什么时候起作用呢? 应该是在到达tomcat之后, 到达servlet之前, tomcat对request请求强行使用iso-8859-1进行了解码)

(2.3 有什么办法阻止tomcat对request请求强行iso-8859-1解码呢?

apache-tomcat\conf\server.xml中添加uriencoding="utf-8"配置即可,还是来个图吧)

java转换字符串编码格式的方法 

3) 在后台(servlet)接收字符串(string2)时毫无疑问的乱码了。

) 这时需要将接收到的字符串(string2)根据iso-8859-1编码重新转换为byte流。再将byte流根据utf-8编码重新解码为字符串(sting3)。

5) 这时的字符串(string3)和前台的字符串(string1)是对应同一个二进制流,并且使用的是同一种编码。也就不会乱码了。

乱码的另一种解决办法:

request.setcharacterencoding("utf-8"),这句话熟悉么,这句话的意思是:用"utf-8"编码对客户端的请求进行重新解码。

在步骤2之后(或步骤3中)执行,那么接收到的参数也不会乱码啦。 

一个小例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.unsupportedencodingexception;
 
public class convertencodingformat {
 
  /**
   * 将一段错误解码的字符串重新解码
   */
  public static string convertencodingformat(string str, string formatfrom, string formatto) {
    string result = null;
    if (!(str == null || str.length() == 0)) {
      try {
        result = new string(str.getbytes(formatfrom), formatto);
      } catch (unsupportedencodingexception e) {
        e.printstacktrace();
      }
    }
    return result;
  }
 
  /**
   * test
   */
  public static void main(string[] args) {
     // utf-8编码
    string str = "你好,少年!";
 
    // utf-8编码的byte流强行用iso-8859-1解码,毫无疑问的乱码了
    string str1 = convertencodingformat(str, "utf-8", "iso-8859-1");
    system.out.println(str1);
 
    // 将str1再转化为byte流,重新用utf-8解码,乱码问题解决
    string str2 = convertencodingformat(str1, "iso-8859-1", "utf-8");
    system.out.println(str2);
  }
 
}

java字符串的各种编码转换

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import java.io.unsupportedencodingexception;
 
/**
 * 转换字符串的编码
 */
public class changecharset {
 /** 7位ascii字符,也叫作iso646-us、unicode字符集的基本拉丁块 */
 public static final string us_ascii = "us-ascii";
 
 /** iso 拉丁字母表 no.1,也叫作 iso-latin-1 */
 public static final string iso_8859_1 = "iso-8859-1";
 
 /** 8 位 ucs 转换格式 */
 public static final string utf_8 = "utf-8";
 
 /** 16 位 ucs 转换格式,big endian(最低地址存放高位字节)字节顺序 */
 public static final string utf_16be = "utf-16be";
 
 /** 16 位 ucs 转换格式,little-endian(最高地址存放低位字节)字节顺序 */
 public static final string utf_16le = "utf-16le";
 
 /** 16 位 ucs 转换格式,字节顺序由可选的字节顺序标记来标识 */
 public static final string utf_16 = "utf-16";
 
 /** 中文超大字符集 */
 public static final string gbk = "gbk";
 
 /**
 * 将字符编码转换成us-ascii码
 */
 public string toascii(string str) throws unsupportedencodingexception{
 return this.changecharset(str, us_ascii);
 }
 /**
 * 将字符编码转换成iso-8859-1码
 */
 public string toiso_8859_1(string str) throws unsupportedencodingexception{
 return this.changecharset(str, iso_8859_1);
 }
 /**
 * 将字符编码转换成utf-8码
 */
 public string toutf_8(string str) throws unsupportedencodingexception{
 return this.changecharset(str, utf_8);
 }
 /**
 * 将字符编码转换成utf-16be码
 */
 public string toutf_16be(string str) throws unsupportedencodingexception{
 return this.changecharset(str, utf_16be);
 }
 /**
 * 将字符编码转换成utf-16le码
 */
 public string toutf_16le(string str) throws unsupportedencodingexception{
 return this.changecharset(str, utf_16le);
 }
 /**
 * 将字符编码转换成utf-16码
 */
 public string toutf_16(string str) throws unsupportedencodingexception{
 return this.changecharset(str, utf_16);
 }
 /**
 * 将字符编码转换成gbk码
 */
 public string togbk(string str) throws unsupportedencodingexception{
 return this.changecharset(str, gbk);
 }
  
 /**
 * 字符串编码转换的实现方法
 * @param str 待转换编码的字符串
 * @param newcharset 目标编码
 * @return
 * @throws unsupportedencodingexception
 */
 public string changecharset(string str, string newcharset)
  throws unsupportedencodingexception {
 if (str != null) {
  //用默认字符编码解码字符串。
  byte[] bs = str.getbytes();
  //用新的字符编码生成字符串
  return new string(bs, newcharset);
 }
 return null;
 }
 /**
 * 字符串编码转换的实现方法
 * @param str 待转换编码的字符串
 * @param oldcharset 原编码
 * @param newcharset 目标编码
 * @return
 * @throws unsupportedencodingexception
 */
 public string changecharset(string str, string oldcharset, string newcharset)
  throws unsupportedencodingexception {
 if (str != null) {
  //用旧的字符编码解码字符串。解码可能会出现异常。
  byte[] bs = str.getbytes(oldcharset);
  //用新的字符编码生成字符串
  return new string(bs, newcharset);
 }
 return null;
 }
 
 public static void main(string[] args) throws unsupportedencodingexception {
 changecharset test = new changecharset();
 string str = "this is a 中文的 string!";
 system.out.println("str: " + str);
 string gbk = test.togbk(str);
 system.out.println("转换成gbk码: " + gbk);
 system.out.println();
 string ascii = test.toascii(str);
 system.out.println("转换成us-ascii码: " + ascii);
 gbk = test.changecharset(ascii,changecharset.us_ascii, changecharset.gbk);
 system.out.println("再把ascii码的字符串转换成gbk码: " + gbk);
 system.out.println();
 string iso88591 = test.toiso_8859_1(str);
 system.out.println("转换成iso-8859-1码: " + iso88591);
 gbk = test.changecharset(iso88591,changecharset.iso_8859_1, changecharset.gbk);
 system.out.println("再把iso-8859-1码的字符串转换成gbk码: " + gbk);
 system.out.println();
 string utf8 = test.toutf_8(str);
 system.out.println("转换成utf-8码: " + utf8);
 gbk = test.changecharset(utf8,changecharset.utf_8, changecharset.gbk);
 system.out.println("再把utf-8码的字符串转换成gbk码: " + gbk);
 system.out.println();
 string utf16be = test.toutf_16be(str);
 system.out.println("转换成utf-16be码:" + utf16be);
 gbk = test.changecharset(utf16be,changecharset.utf_16be, changecharset.gbk);
 system.out.println("再把utf-16be码的字符串转换成gbk码: " + gbk);
 system.out.println();
 string utf16le = test.toutf_16le(str);
 system.out.println("转换成utf-16le码:" + utf16le);
 gbk = test.changecharset(utf16le,changecharset.utf_16le, changecharset.gbk);
 system.out.println("再把utf-16le码的字符串转换成gbk码: " + gbk);
 system.out.println();
 string utf16 = test.toutf_16(str);
 system.out.println("转换成utf-16码:" + utf16);
 gbk = test.changecharset(utf16,changecharset.utf_16le, changecharset.gbk);
 system.out.println("再把utf-16码的字符串转换成gbk码: " + gbk);
 string s = new string("中文".getbytes("utf-8"),"utf-8");
 system.out.println(s);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/H12KJGJ/article/details/68065637

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部