|
1
2
3
|
public byte[] getBytes() { return StringCoding.encode(value, 0, value.length); } |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
static byte[] encode(char[] ca, int off, int len) { String csn = Charset.defaultCharset().name(); try { // use charset name encode() variant which provides caching. return encode(csn, ca, off, len); } catch (UnsupportedEncodingException x) { warnUnsupportedCharset(csn); } try { return encode("ISO-8859-1", ca, off, len); } catch (UnsupportedEncodingException x) { // If this code is hit during VM initialization, MessageUtils is // the only way we will be able to get any kind of error message. MessageUtils.err("ISO-8859-1 charset not available: " + x.toString()); // If we can not find ISO-8859-1 (a required encoding) then things // are seriously wrong with the installation. System.exit(1); return null; } } |
|
1
|
String csn = Charset.defaultCharset().name(); |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public static Charset defaultCharset() { if (defaultCharset == null) { synchronized (Charset.class) { String csn = AccessController.doPrivileged( new GetPropertyAction("file.encoding")); Charset cs = lookup(csn); if (cs != null) defaultCharset = cs; else defaultCharset = forName("UTF-8"); } } return defaultCharset; } |
|
1
2
3
4
5
6
7
|
public class Demo { public static void main(String[] args) { System.out.println("file.encoding="+System.getProperty("file.encoding")); byte[] bytes = "黑马程序员".getBytes(); System.out.println(Arrays.toString(bytes)); }} |
|
1
2
|
file.encoding=UTF-8[-23, -69, -111, -23, -87, -84, -25, -88, -117, -27, -70, -113, -27, -111, -104] |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
@WebServlet("/user/findAllServlet")public class ServletDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("findAllServlet..."); System.out.println("file.encoding="+System.getProperty("file.encoding")); byte[] bytes = "黑马程序员".getBytes(); System.out.println(Arrays.toString(bytes)); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); }} |
|
1
2
|
file.encoding=GBK[-70, -38, -62, -19, -77, -52, -48, -14, -44, -79] |
发现事与愿违.file.encoding依然是UTF-8的.也就是说file.encoding跟文件的编码没有任何关系.相同的代码.我们用命令行窗口去编译和运行.发现file.encoding竟然变成了GBK
|
1
2
3
|
C:\Users\yanjingpan\Desktop>java Demofile.encoding=GBK[-70, -38, -62, -19, -77, -52, -48, -14, -44, -79] |
我们讲Demo.java文件改成UTF-8编码格式的用 javac -encoding utf-8 Demo.java进行编译.然后运行发现file.encoding竟然没有变:
|
1
2
3
|
C:\Users\yanjingpan\Desktop>java Demofile.encoding=GBK[-70, -38, -62, -19, -77, -52, -48, -14, -44, -79] |
这说明file.encoding跟编译环境没有关系.只跟运行环境有关.我们尝试运行的时候指定file.encoding编码:
|
1
|
java -Dfile.encoding=utf-8 Demo |
运行结果就是:
|
1
2
|
file.encoding=utf-8[-23, -69, -111, -23, -87, -84, -25, -88, -117, -27, -70, -113, -27, -111, -104] |
运行时将file.encoding指定成gbk
|
1
|
java -Dfile.encoding=gbk Demo |
运行结果就是:
|
1
2
3
|
C:\Users\yanjingpan\Desktop>java Demofile.encoding=GBK[-70, -38, -62, -19, -77, -52, -48, -14, -44, -79] |
到此我们就知道了.Tomcat在启动的时候将file.encoding指定成了gbk.所以我们在Servlet中获取字节码数组的时候,默认用的就是gbk.
Tomcat是根据当前操作系统来设置file.encoding的值.我电脑是windows简体中问的.所以默认就是GBK的.
我们可以在catalina.bat中将file.encoding设置成utf-8.
|
1
|
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Dfile.encoding=UTF-8" |
重启Tomcat.再访问我们的Servlet.file.encoding就改成UTF-8的了.
至此,困扰我们的getBytes()默认编码格式问题就解决了.
|
1
2
3
|
public byte[] getBytes() { return StringCoding.encode(value, 0, value.length); } |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
static byte[] encode(char[] ca, int off, int len) { String csn = Charset.defaultCharset().name(); try { // use charset name encode() variant which provides caching. return encode(csn, ca, off, len); } catch (UnsupportedEncodingException x) { warnUnsupportedCharset(csn); } try { return encode("ISO-8859-1", ca, off, len); } catch (UnsupportedEncodingException x) { // If this code is hit during VM initialization, MessageUtils is // the only way we will be able to get any kind of error message. MessageUtils.err("ISO-8859-1 charset not available: " + x.toString()); // If we can not find ISO-8859-1 (a required encoding) then things // are seriously wrong with the installation. System.exit(1); return null; } } |
|
1
|
String csn = Charset.defaultCharset().name(); |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public static Charset defaultCharset() { if (defaultCharset == null) { synchronized (Charset.class) { String csn = AccessController.doPrivileged( new GetPropertyAction("file.encoding")); Charset cs = lookup(csn); if (cs != null) defaultCharset = cs; else defaultCharset = forName("UTF-8"); } } return defaultCharset; } |
|
1
2
3
4
5
6
7
|
public class Demo { public static void main(String[] args) { System.out.println("file.encoding="+System.getProperty("file.encoding")); byte[] bytes = "黑马程序员".getBytes(); System.out.println(Arrays.toString(bytes)); }} |
|
1
2
|
file.encoding=UTF-8[-23, -69, -111, -23, -87, -84, -25, -88, -117, -27, -70, -113, -27, -111, -104] |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
@WebServlet("/user/findAllServlet")public class ServletDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("findAllServlet..."); System.out.println("file.encoding="+System.getProperty("file.encoding")); byte[] bytes = "黑马程序员".getBytes(); System.out.println(Arrays.toString(bytes)); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); }} |
|
1
2
|
file.encoding=GBK[-70, -38, -62, -19, -77, -52, -48, -14, -44, -79] |
发现事与愿违.file.encoding依然是UTF-8的.也就是说file.encoding跟文件的编码没有任何关系.相同的代码.我们用命令行窗口去编译和运行.发现file.encoding竟然变成了GBK
|
1
2
3
|
C:\Users\yanjingpan\Desktop>java Demofile.encoding=GBK[-70, -38, -62, -19, -77, -52, -48, -14, -44, -79] |
我们讲Demo.java文件改成UTF-8编码格式的用 javac -encoding utf-8 Demo.java进行编译.然后运行发现file.encoding竟然没有变:
|
1
2
3
|
C:\Users\yanjingpan\Desktop>java Demofile.encoding=GBK[-70, -38, -62, -19, -77, -52, -48, -14, -44, -79] |
这说明file.encoding跟编译环境没有关系.只跟运行环境有关.我们尝试运行的时候指定file.encoding编码:
|
1
|
java -Dfile.encoding=utf-8 Demo |
运行结果就是:
|
1
2
|
file.encoding=utf-8[-23, -69, -111, -23, -87, -84, -25, -88, -117, -27, -70, -113, -27, -111, -104] |
运行时将file.encoding指定成gbk
|
1
|
java -Dfile.encoding=gbk Demo |
运行结果就是:
|
1
2
3
|
C:\Users\yanjingpan\Desktop>java Demofile.encoding=GBK[-70, -38, -62, -19, -77, -52, -48, -14, -44, -79] |
到此我们就知道了.Tomcat在启动的时候将file.encoding指定成了gbk.所以我们在Servlet中获取字节码数组的时候,默认用的就是gbk.
Tomcat是根据当前操作系统来设置file.encoding的值.我电脑是windows简体中问的.所以默认就是GBK的.
我们可以在catalina.bat中将file.encoding设置成utf-8.
|
1
|
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Dfile.encoding=UTF-8" |
重启Tomcat.再访问我们的Servlet.file.encoding就改成UTF-8的了.
至此,困扰我们的getBytes()默认编码格式问题就解决了.
更多免费技术资料可关注:annalin1203