java字符集编码

合集下载

Java自动检测文件编码(字符集)

Java自动检测文件编码(字符集)

Java⾃动检测⽂件编码(字符集)// 使⽤之前请调⽤getAllDetectableCharsets()检查是否满⾜要求,中⽂仅有{gb18030, big5,utf-*}import com.ibm.icu.text.CharsetDetector;import com.ibm.icu.text.CharsetMatch;static HashSet<String> getWhiteList(String fileName) {if (fileName == null) {return null;}HashSet<String> rs = null;InputStreamReader isr = null;BufferedReader br = null;try {FileInputStream fis = new FileInputStream(fileName);BufferedInputStream bis = new BufferedInputStream(fis);// markSupportedCharsetMatch charsetMatch = new CharsetDetector().setText(bis).detect();if (charsetMatch != null) {isr = new InputStreamReader(bis, charsetMatch.getName());System.out.println("Open '" + fileName + " ' with charset: " + charsetMatch.getName());} else {isr = new InputStreamReader(bis);System.out.println("Open '" + fileName + " ' with charset( default, because no charset is detected by IBM.ICU4J): "+ isr.getEncoding());}br = new BufferedReader(isr);String line = null;rs = new HashSet<String>();while ((line = br.readLine()) != null) {rs.add(line);}} catch (FileNotFoundException e) {System.out.println("WARNING: File '" + fileName + "' is not exist.");} catch (IOException e) {System.out.println("WARNING: IOException occured when read Whitelist.");} finally {try {if (br != null) {br.close();}} catch (IOException e) {System.out.println("WARNING: IOException occured when close BufferedReader.");}}return rs;}。

java icu 字符集编码映射规则

java icu 字符集编码映射规则

java icu 字符集编码映射规则
在 Java 中,ICU(International Components for Unicode)库是
一个 Unicode 和国际化支持的开源库。

它提供了许多与字符集编码相关的功能和规则。

ICU 提供了以下编码映射规则和功能:
1. 字符集编码转换:ICU 提供了将不同字符集编码之间进行转换的功能。

它支持常见的字符集编码,如UTF-8、UTF-16、GB2312、ISO-8859-1 等。

2. 字符集编码自动检测:ICU 提供了自动检测给定字节数组的编码的功能。

它可以根据字节的序列和字符集编码的特征来判断最可能的编码。

3. Unicode 规范支持:ICU 实现了 Unicode 规范,并提供了Unicode 字符的属性信息、正则表达式支持、字符转换等功能。

4. 字符集编码遍历:ICU 提供了遍历指定字符集编码中的所有字符的功能。

这对于生成字符集编码相关的索引或列表非常有用。

5. 字符集编码相关类:ICU 提供了一系列与字符集编码相关的类,如 CharsetEncoder、CharsetDecoder、Charset、CharsetProvider 等。

ICU 的字符集编码映射规则可以用于处理文本文件、网络传输、
数据库存储等场景中的字符集编码转换和处理。

它提供了一种可靠和准确的方式来支持不同字符集编码之间的转换和交互。

java编码

java编码
Java编码基础
基础概念
字符 字符集(character set)
字符的集合 定义码点与字符的映射关系 例:unicode(统一码),gb2312,ascii等
码点(code point) 码元(code unit) 编码(encoding)
定义码元(code unit)与码点的关系 在unicode之前,其实字符集与编码是确定的,就是说码元与码点是一致的,直到出现了unicode编码后,才有了字符集与编码的概念 字符集与编码关系:
单字节符号:字节第一位设为0,后面7位与unicode码相同,与ASCII码相同。 对于N字节符号(N>1):第一个字节前N位设置为1,第N+1位设置为0,后面字节的前
两位一律为10,剩下的没有提及的二进制位,全是这个符号的unicode码。
编码规则:
UTF-8与unicode的转化
以汉字“严”为例(Unicode->UTF-8):
UNICODE码(统一码)
1990年研发,1994年公布。 只是一个字符集(码表),不是一种编码,比如utf8是unicode的一种编码。 规定了符号的二进制代码,却没有规定如何存储。
UTF-8编码(Unicode Transfer Format)
是一种变长编码,使用1-4字节表示一个符号。 是ASCII的超集,兼容ASCII(使用一字节表示)。 编码规则:
String str = "中国人严";
for(int i = 0; i < str.length();i++) { char c = str.charAt(i); sb.append("\\u" + Integer.toHexString(c));

java 常用编码格式

java 常用编码格式

java 常用编码格式
Java 中常用的编码格式有:
1.UTF-8:UTF-8 是 Java 的默认编码格式,也是目前使用最广泛的编码格式之一。

它是一种可变长度的编码方式,支持几乎所有的国家和地区字符。

2.GB2312:GB2312 是中国制定的国家标准编码,用于表示简体中文。

3.GBK:GBK 是 GB2312 的扩展,支持繁体中文和部分其他字符集。

4.ISO-8859-1:ISO-8859-1 是西欧语言的编码标准,支持包括英文在内的多种语言。

5.BIG5:BIG5 是中国台湾地区制定的国家标准编码,用于表示繁体中文。

在 Java 中,可以通过以下方式获取和设置编码格式:
java复制代码
// 获取默认编码格式
String defaultEncoding = System.getProperty("file.encoding");
// 设置编码格式
OutputStream outputStream = new FileOutputStream("file.txt");
outputStream.write(bytes, 0, bytes.length,
Charset.forName("UTF-8"));
其中,System.getProperty("file.encoding")可以获取 JVM 启动时设置的默认编码格式;Charset.forName("UTF-8")可以指定特定的编码格式,此处为 UTF-8。

Java中的字节,字符与编码,解码

Java中的字节,字符与编码,解码

Java中的字节,字符与编码,解码ASCII编码ASCII码主要是为了表⽰英⽂字符⽽设计的,ASCII码⼀共规定了128个字符的编码(0x00-0x7F),只占⽤了⼀个字节的后⾯7位,最前⾯的1位统⼀规定为0。

ISO-8859-1编码为了扩展覆盖其他语⾔字符,ISO组织在ASCII码基础上⼜制定了⼀系列标准⽤来扩展ASCII编码,它们是ISO-8859-1~ISO-8859-15,其中ISO-8859-1应⽤得最⼴泛。

ISO-8859-1仍然是单字节编码,它总共能表⽰256个字符。

ISO-8859-1向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII⼀致。

因为ISO-8859-1编码范围使⽤了单字节内的所有空间,在⽀持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。

换⾔之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。

Unicode,UCS2和UCS4Unicode是为整合全世界的所有语⾔⽂字⽽诞⽣的。

任何⽂字在Unicode中都对应⼀个值,这个值称为代码点(Code Point),常写成 U+XXXX的格式。

⽽⽂字和代码点之间的对应关系就有UCS-2和UCS-4。

UCS-2:⽤两个字节来表⽰代码点,其取值范围为 U+0000~U+FFFF。

UCS-4:为了能表⽰更多的⽂字,⼈们⼜提出了UCS-4,即⽤四个字节表⽰代码点。

它的范围为 U+00000000~U+7FFFFFFF,其中U+00000000~U+0000FFFF和UCS-2是⼀样的。

要注意,UCS-2和UCS-4只规定了代码点和⽂字之间的对应关系,并没有规定代码点在计算机中如何存储。

规定存储⽅式的称为UTF(Unicode Transformation Format),其中应⽤较多的就是UTF-8和UTF-16了。

UTF-8,UTF-16,UTF-32UTF-32是对应于UCS-4,不常⽤。

java常用编码格式

java常用编码格式

java常用编码格式Java 中常用的编码格式有以下几种:1. UTF-8:UTF-8 是一种变长字符编码,支持世界上几乎所有语言的字符集,是目前最常用的编码格式之一。

2. GBK:GBK 是针对简体中文的一种编码格式,它支持简体中文中的常用字符集,但不支持繁体中文和其他少数民族语言。

3. Shift-JIS:Shift-JIS 是一种针对日文、韩文等西文字符集的编码格式,它可以支持中文字符集的编码。

4. 16-bit 编码:16-bit 编码是一种用于在计算机内部存储多字节字符的编码格式,它将一个多字节字符转换为 16 个 ASCII 字符(0-F)。

这种编码格式在处理大量数据时可以显著减少内存占用。

5. 8-bit 编码:8-bit 编码是一种用于在计算机内部存储单字节字符的编码格式,它将一个单字节字符转换为 8 个 ASCII 字符(0-7)。

这种编码格式在处理少量数据时可以显著减少内存占用。

需要注意的是,在 Java 中,不同的字符集需要使用不同的字符编码格式进行转换。

在进行字符串操作时,应该使用正确的字符编码格式,否则可能会出现乱码等问题。

Java 中常用的编码格式有以下几种:1. UTF-8:UTF-8 是一种变长字符编码,支持世界上几乎所有语言的字符集,是目前最常用的编码格式之一。

2. GBK:GBK 是针对简体中文的一种编码格式,它支持简体中文中的常用字符集,但不支持繁体中文和其他少数民族语言。

3. Shift-JIS:Shift-JIS 是一种针对日文、韩文等西文字符集的编码格式,它可以支持中文字符集的编码。

4. 16-bit 编码:16-bit 编码是一种用于在计算机内部存储多字节字符的编码格式,它将一个多字节字符转换为 16 个ASCII 字符(0-F)。

这种编码格式在处理大量数据时可以显著减少内存占用。

5. 8-bit 编码:8-bit 编码是一种用于在计算机内部存储单字节字符的编码格式,它将一个单字节字符转换为 8 个 ASCII 字符(0-7)。

JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

【适用范围】适用EOS所有版本,操作系统不限,数据库不限【问题描述和定位】JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换【解决方案和步骤】1、函数介绍在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为:1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换public byte[] getBytes(String charsetName) throws UnsupportedEncodingException2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException 2、Unicode与各编码之间的直接转换下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换1)Unicode和GBK测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串String-GBK〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4 ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)2)Unicode和UTF-8测试结果如下,每个汉字转换为三个字节,且是可逆的,即通过字节可以转换回字符串String-UTF-8〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE 6%0x96 0x87ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6 587(a中文)3)Unicode和ISO-8859-1测试结果如下,当存在汉字时转换失败,非可逆,即通过字节不能再转换回字符串String-ISO-8859-1〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0x3F 0x3F ByteArray-ISO-8859-1〉String:0x61 0x3F 0x3F-〉\u0061\u003F\u003F(a??)3、Unicode与各编码之间的交叉转换在上面直接转换中,由字符串(Unicode)生成的字节数组,在构造回字符串时,使用的是正确的编码集合,如果使用的不是正确的编码集合会怎样呢?会正确构造吗?如果不能正确构造能有办法恢复吗?会信息丢失吗?下面我们就来看看这种情况,这部分可以说明在某些情况下虽然我们最终正确显示了结果,但其间仍然进行了不正确的转换。

java编码表GBK、GB2312与UTF

java编码表GBK、GB2312与UTF展开全文GBK、GB2312与UTF-8的区别?一,先说下三者各自的定义。

UTF-8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。

是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。

UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。

如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK:是国家标准GB2312基础上扩容后兼容GB2312的标准。

除了兼容GB2312外,它还能显示繁体中文,还有日文的假名该编码共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。

GBK为了区分中文,将其最高位都设定成1。

既一个中文两个字节的第一个字节为负数。

GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。

GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码;GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:二,通过实例来说明。

GBK、GB2312与UTF-8对中文编码时分别使用多少个字节如对"aA你"进行编码编码 a A 你GB2312:97,65,-60,-29,GBK: 97,65,-60,-29,UTF-8: 97,65,-28,-67,-96,通过上面可以看出:GBK、GB2312与UTF-8对英文字母都是用1一个字节表示,对汉语:GB2312:2字节通常第一个字节都是负数GBK: 2字节通常第一个字节都是负数UTF-8: 3字节一般GBK、GB2312的两个字节都为负数,但是对一些不常见的汉字会有例外。

java常用编码格式

java常用编码格式
在Java中,常用的编码格式有以下几种:
1. UTF-8:它是一种可变长度的Unicode字符编码,它可以使用1到4个字节表示一个字符,是最常用的编码格式之一。

它支持全球范围内的大部分字符集,包括中文、日文、韩文等。

2. ISO-8859-1:它是Latin-1字符集的编码方式,它支持欧洲大部分语言的字符。

它是一个单字节编码,每个字符占用一个字节。

但是它并不支持中文等非拉丁字符。

3. GBK/GB2312:它是中文字符集的编码方式,它支持简体中文字符集。

GBK是GB2312的扩展,支持更多的字符。

它是一个双字节编码,每个中文字符占两个字节,英文字符占用一个字节。

4. UTF-16:它是Unicode字符集的编码方式,它支持大部分字符集,包括中文、日文、韩文等。

UTF-16是一个固定长度的编码方式,每个字符占用2个字节。

这些编码格式可以通过Java的字符串类型来表示和处理。

在Java中,字符串类型使用的是UTF-16编码格式,它是Java默认的编码方式。

如果需要在Java中处理其他编码格式的字符串,可以使用相关的编码、解码函数来转换。

例如,可以使用`getBytes()`方法将字符串转换为指定的编码格式字节数组,使用`new String()`方法将字节数组按照指定的编码格式转换为字符串。

java字符编码和oracle乱码

java 字符编码和oracle 乱码编码问题我仍旧没搞懂,最根本的从哪⾥来就没搞懂。

当页⾯发送请求,编码到后台是什么编码呢?好吧,我默认的都是utf-8.后台接收参数后,可以在控制台打印出来,我也不清楚是什么编码。

然后,就是数据库问题。

在mysql数据库,⾸先会设置mysql安装的字符集为utf-8,然后在连接的jdbc上注明characterEncoding是utf-8.⼀直这样统⼀下去,没有出现乱码。

连接oracle就出现问题了,我使⽤的⼀个已经安装好的oracle数据库。

字符集是American,us7ascii.我插⼊和查询的中⽂都是乱码。

百度了很久之后,还是进⾏转码⼯作。

关于java编码,先看String中的⼏个⽅法:getBytes()这⾥先要搞清楚编码(encode)和解码(decode).下⾯是个⼈推测,没有考证的解释:理解了编码和解码后,从⼀个字符串开始解析。

字符串str="中⽂",str是⼀串字符,通过str.getBytes()可以编码成byte数组。

通过new String(bytes)来解码为字符串。

下⾯是测试:1 byte [] ng.String.getBytes(String charsetName) throws UnsupportedEncodingException234 Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.56 The behavior of this method when this string cannot be encoded in the given charset is unspecified. The java.nio.charset.CharsetEncoder class should be used wh encode:编码,将字符依据某种规则(字符集)解释为⼀串数字decode:解码,将⼀串数字依据某种规则翻译为字符1 @Test2 public void getEncod() throws UnsupportedEncodingException {3 String sysencod = System.getProperty("file.encoding");4 System.out.println("系统默认编码:"+sysencod);5 String str = "中⽂";6 System.out.println("字符实例:"+str);7 System.out.println("===============getbytes ⽆参:===============");8 byte [] bytes = str.getBytes();9 for (int i = 0; i < bytes.length; i++) {10 System.out.print(bytes[i]);11 }12 System.out.println();13 System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes));14 System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes,"utf-8"));15 System.out.println("通过gbk 字符集,将字符数组解码为字符:"+new String(bytes,"gbk"));16 System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes,"iso-8859-1"));171819 System.out.println("===============getbytes(utf-8):===============");20 byte [] bytes2 = str.getBytes("utf-8");21 for (int i = 0; i < bytes.length; i++) {22 System.out.print(bytes[i]);23 }24 System.out.println();25 System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes2));26 System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes2,"utf-8"));27 System.out.println("通过gbk 字符集,将字符数组解码为字符:"+new String(bytes2,"gbk"));28 System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes2,"iso-8859-1"));29 System.out.println("===============getbytes(gbk):===============");30 byte [] bytes3 = str.getBytes("gbk");31 for (int i = 0; i < bytes.length; i++) {32 System.out.print(bytes[i]);33 }34 System.out.println();35 System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes3));36 System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes3,"utf-8"));37 System.out.println("通过gbk 字符集,将字符数组解码为字符:"+new String(bytes3,"gbk"));38 System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes3,"iso-8859-1"));39 System.out.println("===============getbytes(iso-8859-1):===============");40 byte [] bytes4 = str.getBytes("iso-8859-1");41 for (int i = 0; i < bytes.length; i++) {42 System.out.print(bytes[i]);43 }结果:奇诡的是,虽然getBytes打印的byte数组内容看起来是⼀样的,但此编码结构却是不同的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。

我们知道英文中经常使用的字符、数字符号被计算机处理时都是以二进制码的形式出现的。

这种二进制码的集合就是所谓的ASCII码。

每一个ASCII码与一个8位(bit)二进制数对应。

其最高位是0,相应的十进制数是0-127。

如,数字“0”的编码用十进制数表示就是48。

另有128个扩展的ASCII码,最高位都是1,由一些制表符和其它符号组成。

ASCII是现今最通用的单字节编码系统。

GB2312:GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》。

主要用于给每一个中文字符指定相应的数字,也就是进行编码。

一个中文字符用两个字节的数字来表示,为了和ASCII码有所区别,将中文字符每一个字节的最高位置都用1来表示。

GBK:为了对更多的字符进行编码,国家又发布了新的编码系统GBK(GBK的K是“扩展”的汉语拼音第一个字母)。

在新的编码系统里,除了完全兼容GB2312 外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。

ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集,而英文实际上只用了其中数字小于128的部分。

Unicode:这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容。

如“a” 的ASCII码为0x61,UNICODE 就为0x00,0x61。

UTF-8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。

一个7位的ASCII码值,对应的UTF码是一个字节。

如果字符是
0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节。

我们运行java程序时,JVM有自己所支持的编码种类,用以下代码可以看到:
Map m=Charset.availableCharsets();
Set names=m.keySet();
Iterator it=names.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
然后可以通过以下代码看到我们目前JVM所使用的编码:
Properties pps=System.getProperties();
pps.list(System.out);
具体来说什么是编码,什么是解码?
在InputStreamReader JDK有这样描述:It reads bytes and decodes them into characters using a specified charset.(用指定的字符集将字节数组解码成字符串)。

相反OutputStreamWriter 描述:Characters written to it are encoded into bytes using a specified charset.(用指定的字符集将字符串编码成字节数组)。

理解这个以后一切好办了啦!
我们的OS一般是GBK编码的(凡是从磁盘上读取文件可以看成是用OS的字符集编码方式来对操作对象进行解码处理--从标准输入设备读取数据的时候是依赖OS的字符集)。

而我们将从磁盘上文件经过处理得到我们想要的字符串等其它对象的时候,这一过程是用JVM的默认的字符集编码方式来处理的!由于不同的字符集编码方式有着不同的原理(前面所述),这样当编码与解码不一致的时候,自然而然就出现了可爱的乱码。

比如如下,将我们JVM字符集改成iso-8859-1这样在就与我们的OS不同:
当输入中文时自然就输出的是乱码了。

pps.put("file.encoding","ISO-8859-1");
int data;
byte[] buf=new byte[100];
int i=0;
while((data=System.in.read())!='q')
{
buf[i]=(byte)data;
i++;
}
String str=new String(buf,0,i);
System.out.println(str);
这时我们可以用string的一个构造方法:
String(byt[] bytes, String charsetName)
Constructs a new String by decoding the specified array of bytes using the specified charset.(用指定的字符集对字节数组进行解码)。

其中用到了string 的getBytes方法:
getBytes(String charsetName)
Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.(用指定的字符集进行编码,将结果存放到一字节数组里面)重新构造一个string:
String strGBK=new String(str.getBytes("ISO-8859-1"),"GBK");
这样又可以重新得到我们想要的汉字了。

我们这例子中是GBK(OS)来编码的,然后采用iso-8859-1(JVM)来解码得到一个新string(此string是乱码),然后将此string用iso-8859-1重新编码,并且用指定的GBK来解码。

得到一个新string(也就是strGBK),这个string就不再是乱码了。

但如果我们一开始就采用GBK解码得到的字符串,然后用ISO-8859-1编码,能否再解码回去得到我们的中文字符呢?显示不可以啦,因为用ISO-8859-1的编码的时候采用是一种单字节的字符集来对其编码,这样就丢失了一个字节(对中文来说)!所以这样是得不到中文字符的!。

相关文档
最新文档