-
2021-02-12 17:54:15
一、按不同编码方式进行试转换,比较转换后与转换前是否相同:
// 识别字符串编码
public static String getEncoding(String str) {
if (str == null || str.trim().length() < 1)
return "";
// 常用字符编码数组
String[] encodes = new String[] { "GBK", "ISO-8859-1", "GB2312",
"GB18030", "UTF-8" };
for (String encode : encodes) {
try {
// 匹配字符编码
if (str.equals(new String(str.getBytes(), encode))) {
// 返回编码名称
return encode;
} else {
continue;
}
} catch (Exception er) {
}
}
return "";
}
二、分析byte[]来判断规律。
缺点:有时,个别本地编码字节在utf8中也会出现,导致出错,需要分析。
public static boolean isValidUtf8(byte[] b,int aMaxCount){
int lLen=b.length,lCharCount=0;
for(int i=0;i < lLen; i++){
byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)
if(lByte>=0) continue;//>=0 is normal ascii
if(lByte(byte)0xfd) return false;
int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8? 4 :lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;
if(i+lCount>lLen) return false;
for(int j=0;j=(byte)0xc0) return false;
}
return true;
}
相应地,一个使用上述方法的例子如下:
public static String getUrlParam(String aStr,String aDefaultCharset) throws UnsupportedEncodingException{
if(aStr==null) return null;
byte[] lBytes=aStr.getBytes("ISO-8859-1");
return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset);
}
三:使用jchardet组件:
jchardet是mozilla自动字符集探测算法代码的java移植,其源代码可以从sourceforge下载。这个算法的最初作者是frank Tang,C++源代码在
http://www.infomall.cn/cgi-bin/mallgate/20040514/
http://lxr.mozilla.org/mozilla/source/intl/chardet/,可以从
http://www.infomall.cn/cgi-bin/mallgate/20040514/
http://www.mozilla.org/projects/intl/chardet.html
得到更多关于这个算法的信息。
分享到:
2012-05-14 09:52
浏览 4464
评论
更多相关内容 -
Intellij Idea编译项目下的.java文件时的编码问题
2021-03-13 17:34:08由《编译.java文件时的编码问题》可知,在编译.java文件的时候,需要正确指定一个编码方案,该编码方案用于解码.java文件的字节流。那么在使用Intellij Idea编译(假定使用javac编译工具)项目下所有的.java文件时,该...由《编译.java文件时的编码问题》可知,在编译.java文件的时候,需要正确指定一个编码方案,该编码方案用于解码.java文件的字节流。
那么在使用Intellij Idea编译(假定使用javac编译工具)项目下所有的.java文件时,该如何指定正确的编码方案呢?
1)首先,我们需要知道当执行"Build"菜单下的"Make Project"命令,编译整个项目下的.java文件的时候,Intellij Idea执行的具体命令。我们可以通过以下方式获得,执行"Build"菜单下的"Generate Ant Build"命令,生成一个Ant Build File,然后通过这个Ant Build File,我们就可以得到Intellij Idea在编译整个项目的时候执行的具体命令。[1]
2)借助于1)中的Ant Build File,可以发现Intellij Idea在编译项目下的.java文件时,执行的具体命令是“带有各种参数的javac命令”。其中有一个"-encoding"参数,该参数就是用来指定编译.java文件时应该使用的编码方案的,如图1所示。Intellij Idea自身有一套机制,用来确定该参数的值,经过测试,该值有可能来自"Project Encoding"的配置,见图2;有可能来自某个.java文件被Intellij Idea检测到的使用的编码方案,见链接;也有可能来自图3中所示的编译器参数配置等等。具体的机制需要查阅相关文档。
图1
图2
图3
3)由2)可得,Intellij Idea自身有一套确定"-encoding"参数值的机制,但是往往最后被确定的值不是我们想要的。而且"encoding"参数是非常重要的一个参数,为了更加准确地指定"-encoding"参数,我们可以在图3所示的编译器参数配置中明确配置"-encoding xxx"。
参考文献:
[1]http://stackoverflow.com/questions/2966530/can-i-see-the-exact-commands-intellij-uses-to-build-a-java-project
-
Java编码规范
2014-02-20 17:27:40为使开发项目中所有的JAVA程序代码的风格保持一致,增加代码的可读性,便于维护及内部交流,使JAVA程序开发人员养成良好的编码习惯,有必要对JAVA程序的代码编码风格做统一的规范约束。本文档定义了我公司软件开发... -
java获取字符串编码类型代码(导入直接查看结果)
2012-04-17 10:05:52java获取字符串编码类型代码(导入直接查看结果) -
Java字符编码设置总结
2021-02-13 00:04:591、eclipse workspace中的字符编码:windows->Preferences->general->Workspace以后新建立工程其属性对话框中的Text file encoding即为UTF-8,这个也是安装完Eclipse之后应该立刻做的第一件事,但是这种...1、eclipse workspace中的字符编码:
windows->Preferences->general->Workspace
以后新建立工程其属性对话框中的Text file encoding即为UTF-8,这个也是安装完Eclipse之后应该立刻做的第一件事,但是这种修改只对当前的workspace有效,如果新建或者切换到一个新的workspace下,还是得做同样的步骤。
windows->Preferences->general->Content Types
点开Text,选择Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。其他java应用开发相关的文件如:properties、XML等已经由Eclipse缺省指定,分别为ISO8859-1,UTF-8,如开发中确需改变编码格式则可以在此指定。
2、Java源文件编码格式指定
先中文件,右键属性打开
指定文件编码格式为UTF-8,作用:
(1)、当我们用编辑器编写java源文件,程序文件在保存时会采用操作系统默认的编码格式(一般我们中文的操作系统采用的是GBK编码格式)形成一个.java文件。java源文件是采用操作系统默认支持的file.encoding编码格式保存的。通过System.out.println(System.getProperty('file.encoding')); 可以查看系统的file.encoding参数值。
(2)、JDK在编译的时候,如果没有用-encoding参数指定java源程序的编码格式,则javac首先获得操作系统默认采用的编码格式(file.encoding),也即在编译java程序时,若不指定源程序文件的编码格式,JDK首先获得操作系统默认的编码格式,xp是GBK,然后jdk就把java源程序从该编码格式转化为java内部的unicode格式放入内存中。然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是unicode编码的,它暂放在内存中,紧接着,JDK将此以unicode编码的编译后的class文件保存到操作系统中形成.class文件。最终获得的.class文件是内容以unicode编码格式保存的类文件,它内部包含源程序中的中文字符串,只不过此时它己经由安装系统编码格式转化为unicode格式了。
也就是说,指定源文件编码格式将告诉编译器从何种编码格式转为UNICODE,以生成最终的.class,就是说我们常见的.class文件中的内容无论是中文字符还是英文字符,他们都已经转换为Unicode编码格式了。
3、javac -encoding
见上段描述,如果设置了文件编码格式,就不需要指定了,在windows与linux下编译都不会有问题。
4、JSP编码格式指定
我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的,在上面代码中有两个地方存在编码:pageEncoding、contentType的charset。其中pageEncoding是jsp文件本身的编码,而contentType的charset是指服务器发送给客户端时的内容编码。
pageEncoding
JVM将JSP编译为.java文件,JVM首先会获取pageEncoding的值,如果该值存在则采用它设定的编码来编译,否则则采用file.encoding编码来编译。
charset
后台经过处理后将结果输送到客户端,如果设置了charset则浏览器就会使用指定的编码格式进行解码,否则采用默认的ISO-8859-1编码格式进行解码处理。
5、Tomcat server.xml中URIEncoding
提交请求到服务器,主要有GET跟POST两种方式,利用request.setCharacterEncoding('UTF-8');来设置Tomcat接收请求的编码格式,只对POST方式提交的数据有效,对GET方式提交的数据无效!
要设置GET的编码,可以修改server.xml文件中的配置:
connectionTimeout='20000'
redirectPort='8443' URIEncoding='UTF-8' />
如果没有设置则会使用默认的ISO-8859-1来解码,假如我们在页面将编码设置为UTF-8,而URIEncoding设置的不是或者没有设置,那么服务器进行解码时就会产生乱码。这个时候我们一般可以通过new String(request.getParameter('name').getBytes('iso-8859-1'),'utf-8') 的形式来获取正确数据。
6、spring过滤器中的编码设置encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
源代码中有以下两行代码:
request.setCharacterEncoding(this.encoding); //用途:设置客户端post过来的数据的编码格式。
response.setCharacterEncoding(this.encoding); //用途:设置服务器将数据发送到客户端时的编码格式,这行代码要在设置forceEncoding为true时才起作用。
7、java -Dfile.encoding
设置启动JVM进程时系统属性 file.encoding 为 UTF-8,在运行java程序时JVM首先会把保存在操作系统中的class文件读入到内存中,这个时候内存中class文件编码格式为Unicode,然后JVM运行它。如果需要用户输入信息,则会采用file.encoding编码格式对用户输入的信息进行编码同时转换为Unicode编码格式保存到内存中。程序运行后,将产生的结果再转化为file.encoding格式返回给操作系统并输出到界面去,如果是servlet以GET或POST的形式来接收数据,则参见第5段的说明。
简单的说:源文件编码的格式与java进程的file.encoding编码格式一样,那么在控制台的输入与输出则不会乱码,对于通过get或post接收的数据则通过需要过滤器统一设置编码格式,见第5、6段的说明。
我们常见的websphere、weblogic在linux下运行时,通常需要为java进程设置-Dfile.encoding参数就是这个原因。
8、JDBC编码
java程序与数据库的连接都是通过JDBC驱动程序来连接的,而JDBC驱动程序默认的是ISO-8859-1编码格式的,也就是说我们通过java程序向数据库传递数据时,JDBC首先会将Unicode编码格式的数据转换为ISO-8859-1的编码格式,然后在存储在数据库中,即在数据库保存数据时,默认格式为ISO-8859-1,如果数据库服务设定了字符集则会按设定的格式转化,或者在配置jdbc连接串时就需要指定连接的字符编码格式。
所以统一都设置为UTF-8是个好方案。。。
-
eclipse如何查看当前项目的编码方式+java编码方式总结
2018-10-30 19:31:00我们写代码有时候会出现这种情况:在自己电脑上运行的很...如何查看eclipse 中java项目的编码方式: 如图右击项目名称,然后选择propertices选项,就可以了 我的这个项目的默认编码方式是utf-8 ,下面对java...我们写代码有时候会出现这种情况:在自己电脑上运行的很正常,字符显示很完美,把自己的代码给别人或者换台机器运行,就会出现乱码的现象,这是为什么呢?都是编码方式在作祟,不同的机器或java项目可能使用的默认编码不同。
如何查看eclipse 中java项目的编码方式:
如图右击项目名称,然后选择propertices选项,就可以了
我的这个项目的默认编码方式是utf-8 ,下面对java的编码方式总结一下,记录一下:
import java.io.UnsupportedEncodingException; public class EncodeDemo { public static void main(String[] args) throws UnsupportedEncodingException{ String s = "我爱ABC"; byte[] byte1 = s.getBytes();//以系统默认的编码方式转换为字节流 System.out.print(" 默 认 编 码 输 出 :"); for(byte b : byte1){ System.out.print(Integer.toHexString(b & 0xff) + " "); } System.out.print("\nutf-8编码输 出:"); byte[] byte2 = s.getBytes("utf-8");//以utf-8的编码转换 for(byte b : byte2){ System.out.print(Integer.toHexString(b & 0xff) + " "); } /* * 以上两个输出说明该工程使用的默认编码是utf-8 * 该编码格式一个汉字栈占用三个字节,英文字母占用一个字节 */ System.out.print("\n gbk编码输出:"); byte[] byte3 = s.getBytes("gbk"); for(byte b : byte3){ System.out.print(Integer.toHexString(b & 0xff) + " "); } /* * gbk编码格式,中文占两个字节,英文字母占一个字节 */ System.out.print("\nutf-16be输出:"); /* * java使用的双字节编码(utf-16be) * 中文英文都是两个字节 */ byte[] byte4 = s.getBytes("utf-16be"); for(byte b : byte4){ System.out.print(Integer.toHexString(b & 0xff) + " "); } /* * 当我们吧utf-16be编码格式的byte4转换为数组时,不指定编码方式,而是使用 * 项目默认编码方式,发现打印出来的是乱码,之后将编码方式改为上面utf-16be的 * 格式再打印发现没有乱码。同理,如果我们想将byte3转换为字符串再输出,则需要 * 使用对应的gbk的编码方式,这样才不会乱码 */ System.out.println(); String s1 = new String(byte4);//使用项目默认的编码(utf-8) System.out.println(s1); String s2 = new String(byte4,"utf-16be"); System.out.println(s2); } }
代码中b & 0xff 操作是为了去掉整数高24位多余的0,因为我们知道一个字节8位,而int是四个字节,所以byte转换为int后就变成了32位,但高24位都是0,影响视觉效果,所以用这个操作把它去掉就好了。输出结果如下图:
-
java编码规范考试题答案
2021-03-08 08:48:11中软java编码规范考试题满分答案B. 无SSL传输通道或者代价太高C. 敏感数据需要持久化长久保存D. 同一信任域内组件间传递13. 下列JDK中的API调用中若使用不当易遭致OS命令注入的是BA. ... -
详解Java编码与解码以及常见的编码表,灵活处理乱码问题
2021-05-09 16:05:26编码与解码 文章目录编码与解码前言一、什么是编码与...1610.3、UTF-810.4、BOM11、乱码的原因和可逆性11.1、乱码原因11.2、乱码可逆情况11.3、乱码不可逆情况三、Java的char字符四、String类1、编码的方法1.1、getByte -
java对字符的编码处理
2021-02-28 14:15:38在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。1. getBytes(charset)这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset... -
用Java实现Http URL地址编码
2021-02-12 09:35:06请注意,以上大多数答案都是...URLEncoder用于将数据作为参数传递,而不是编码URL本身。换句话说,"http://search.barnesandnoble.com/booksearch/first book.pdf"是网址。例如,参数将是,"http://search.barnesand... -
java进行url编码和解码
2022-02-17 18:25:56public static String getURLEncoderString(String str) { String result = ""; if (null == str) { return "";... result = java.net.URLEncoder.encode(str, "UTF-8"); } catch (UnsupportedEncodin. -
java查看当前系统的的编码方式
2019-05-05 10:52:17java查看当前系统的的编码方式 public static void main(String[] args) { //查看当前系统的字符编码方式 System.out.println(Charset.defaultCharset().name()); //查看当前系统的编码方式 System.out.println... -
Java获取文件编码格式
2020-10-14 17:30:52import java.io.*; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.StandardCopyOption; public class FileCharsetCheckUtils { public static void main(String[] args) ... -
java字符类型采用什么编码方式
2021-02-12 15:06:53java 的字符类型采用的是 Unicode 编码方案。Java采用UTF-16编码作为内码,也就是说在JVM内部,文本是用16位码元序列表示的,常用的文本就是字符(char)和字符串(String)字面常量的内容。而,UTF-16是Unicode字符集的... -
如何查看Java源文件的编码方式及去掉BOM
2018-06-21 17:42:58一、查看Java源文件的编码方式用EditPlus打开Java源文件,点击菜单栏“File”——>"Save as",弹出窗口。本例中是UTF-8编码,换做其他源文件,也可能会出现其他编码方式,如ANSI(中文操作系统中... -
详解Java中String类型与默认字符编码
2021-02-12 18:02:17为什么写这个至于为什么要写这个...这次终于忍不住了,一定要弄个明白String类型的编码方式从网上查的资料都说,Java默认的字符编码是Unicode,而String类型的编码方式是与JVM编码方式和本机操作系统默认字符集有关... -
Java——获取字符串编码格式
2020-08-27 09:20:52判断一个字符串的编码格式: public static String getEncoding(String str) { String encode = "GB2312"; try { if (isEncoding(str, encode)) { // 判断是不是GB2312 return encode; } } catch (Exception ... -
java和js相互base64编码解码
2014-12-24 15:44:53我在网上找了半天的java、js的base64编码解码结果没有,只好自己写了,js一个文件,java一个文件,调用里面是使用方法 -
java获取文件编码格式
2019-01-09 15:57:20java开发时在以流的方式读取文件内容时,往往会中文乱码,那么就要考虑到统一编码格式 InputStreamReader read = new InputStreamReader(new FileInputStream(file),encoding); 获得文件编码 /** * 获得文件... -
华为java编码规范模板
2011-04-07 11:24:29华为java编码规范模板,让你的编码格式更加标准化。 通eclipse来导入两个文件。 -
java中的编码与解码
2018-05-17 21:05:08编码表概述和常见的编码表 概述:有字符及其对应的数值组成的一张表 常见的编码表 ASCII:美国标准信息交换表 ISO8859-1:拉丁码表,欧洲码表 GB2312:中国的中文编码表 GBK:中国的中文编码表升级 GB18030:GBK的... -
Java实现Unicode编码和中文互转
2021-05-08 16:32:20Java实现Unicode编码和中文互转 1.中文字符串转换为Unicode编码 /** * 中文转Unicode * 其他英文字母或特殊符号也可进行Unicode编码 * @param cn * @return */ public static String cnToUnicode(String cn... -
Java实现视频编码格式转换(转libx264编码格式)
2022-04-21 10:49:33导入依赖 <dependency> <groupId>ws.schild</groupId> <artifactId>jave-core</artifactId> <version>2.4.5</version> </dependency> <... -
java判断文本文件编码格式
2019-08-06 09:32:00上篇文章需要读取当前java或者配置文件的编码格式,这里主要支持UTF-8、GBK、UTF-16、Unicode等 /** * 判断文件的编码格式 * @param fileName :file * @return 文件编码格式 * @throws Exception */ ... -
java中怎么获取、设置文件编码格式?
2021-02-28 12:43:55/* * 如果在调用FileOutputStream的构造方法时没有加入true,那么新加入的字符串就会替换掉原来写入的字符串, * 在调用构造方法时指定了字符的编码,新写入的字符,会使用新指定的编码 */ osw = new ... -
Java编码和解码Unicode
2018-03-13 15:09:54Java编码和解码Unicode -
java中的url进行编码和解码
2021-11-08 21:56:37编码和解码的类 java.net.URLDecoder.decode(url,解码格式) 解码器.解码方法。转化成普通字符串, URLEncoder.decode(url,编码格式) 将普通字符串变成指定格式的字符串, package com.zixue.springbootmybatis.test... -
java安全编码指南之:字符串和编码
2020-09-16 09:41:28字符串是我们日常编码过程中使用到最多的java类型了。全球各个地区的语言不同,即使使用了Unicode也会因为编码格式的不同采用不同的编码方式,如UTF-8,UTF-16,UTF-32等。 我们在使用字符和字符串编码的过程中会... -
java 字符串编码转换的实现方法
2022-04-13 10:49:59实现动态字符编码转换,解决乱码 -
获取文件编码格式(纯JAVA代码,绝对对你有用)
2011-07-30 18:04:23java 识别文件的编码格式 读取文件的编码 utf-8 gbk gb2312 java 编码 java 获取文件编码格式 java 乱码查找