字符集<o:p></o:p>
<o:p> </o:p>
转换与编码模式<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
java.nio.charset 包中有三个类可以帮助在将旧应用程序迁移到 Java 平台上时进行字符集之间的转换。John Zukowski 将带您了解这三个类并提供一个演示这种功能的示例。<o:p></o:p>
用数字表示
不怕明说,其实计算机只理解数字。但下面这一点可能就没那么明显 ― 因为计算机只理解数字,所以它们需要用某种形式把数字值映射为相应的字符,这样才能显示文本。就是这些映射(或 字符集)才使得计算机可以理解文本。例如,就为了这种映射,早期的台式机使用了 ASCII。当一台使用 ASCII 的计算机存储数字 72、101、108 和 112 时,它便知道要显示“Help”这个单词,因为在 ASCII 中,数字 72 是 H 的值、101 是 e 的值、108 是 l 的值、112 是 p 的值。但如果这台计算机是早期的 IBM 大型机(它使用 EBCDIC 而不是 ASCII),“Help”这个单词将用数字 200、133、147 和 151 代表。<o:p></o:p>
<o:p> </o:p>
字符集基础知识
在向 Java 语言迁移时, java.nio.charset 包中有三个类帮助进行这种映射: Charset 、 CharsetEncoder 和 CharsetDecoder 。这些类相互配合,这样您就可以先采用一种映射,然后将其转换为另一种映射。在从另一种映射转换为 Java 映射(Unicode)时,您可以使用解码器(decoder)。然后,如果您需要从 Java 映射(Unicode)再转换为另一种映射(或转换回原来那种映射)时,您可以使用编码器(encoder)。您无法用 java.nio.charset 包在两种非 Unicode 格式之间直接转换,但您可以通过一种中间的 Unicode 格式在两种非 Unicode 格式间进行转换。 <o:p></o:p>
在得到一个解码器或编码器之前,您需要获得用于特定映射的 Charset 。例如,US-ASCII 是用于 7 位 ASCII 字符集的映射的名称。您只需象下面这样把该名称传递到 Charset 的 forName() 方法中即可: <o:p></o:p>
<o:p> </o:p>
Charset charset = <o:p></o:p>
Charset.forName("US-ASCII");<o:p></o:p>
|
一旦有了 Charset ,只需按如下所示请求 CharsetDecoder 和 CharsetEncoder : <o:p></o:p>
<o:p> </o:p>
CharsetDecoder decoder =<o:p></o:p>
charset.newDecoder();<o:p></o:p>
CharsetEncoder encoder = <o:p></o:p>
charset.newEncoder();<o:p></o:p>
|
有了解码器和编码器后,您就可以在不同的字符集之间进行转换了,如下所示: <o:p></o:p>
<o:p> </o:p>
ByteBuffer bytes = ...;<o:p></o:p>
CharBuffer chars = decoder.decode(bytes);<o:p></o:p>
bytes = encoder.encode(chars);<o:p></o:p>
|
当然,如果不确定哪些字符集可用,您需要用下面的语句来询问: <o:p></o:p>
<o:p> </o:p>
SortedMap map = <o:p></o:p>
Charset.availableCharsets();<o:p></o:p>
|
然后您将使用特定的解码器把外部字节转换为内部字符。然后,如果需要把数据发送到 Java 代码外,您将使用编码器把内部字符转换为外部字节。至于哪些特定的字符集可用,您的运行时将确定整个字符集。但每个 Java 编程实现都必须支持下列编码: <o:p></o:p>
- US-ASCII:7 位 ASCII <o:p></o:p>
- ISO-8859-1:ISO 拉丁字母 <o:p></o:p>
- UTF-8:8 位 UCS 转换格式 <o:p></o:p>
- UTF-16BE:16 位 UCS 转换格式,大尾数法字节顺序 <o:p></o:p>
- UTF-16LE:16 位 UCS 转换格式,小尾数法字节顺序 <o:p></o:p>
- UTF-16:16 位 UCS 转换格式,用标记(marker)识别的字节顺序 <o:p></o:p>
然后,不同的平台可能支持特定于该平台的额外字符集(例如,在 Windows 平台上,您会发现它支持 Windows-1252 字符集)。如果您需要支持其他的字符集,您可以创建自己的字符集。请参阅 java.nio.charset.spi 包中的 CharsetProvider API。 <o:p></o:p>
完整的示例
清单 1 通过转换单词“Help”的 ASCII 字节数组值(72、101、108 和 112)演示了 Java 字符集转换功能。遗憾的是,缺省情况下没有 EBCDIC 编码器,所以我们将把值转换为 UTF-16LE 字符数组(这只是为每个字符的第二个字节添加一个“0”字节)。 <o:p></o:p>
清单 1. 字符集转换示例<o:p></o:p>
<o:p> </o:p>
import java.nio.*;<o:p></o:p>
import java.nio.charset.*;<o:p></o:p>
import java.util.Arrays;<o:p></o:p>
<o:p> </o:p>
public class Convert {<o:p></o:p>
public static void main(String args[]) {<o:p></o:p>
System.out.println(Charset.availableCharsets());<o:p></o:p>
Charset asciiCharset = Charset.forName("US-ASCII");<o:p></o:p>
CharsetDecoder decoder = asciiCharset.newDecoder();<o:p></o:p>
byte help[] = {72, 101, 108, 112};<o:p></o:p>
ByteBuffer asciiBytes = ByteBuffer.wrap(help);<o:p></o:p>
CharBuffer helpChars = null;<o:p></o:p>
try {<o:p></o:p>
helpChars = decoder.decode(asciiBytes);<o:p></o:p>
} catch (CharacterCodingException e) {<o:p></o:p>
System.err.println("Error decoding");<o:p></o:p>
System.exit(-1);<o:p></o:p>
}<o:p></o:p>
System.out.println(helpChars);<o:p></o:p>
Charset utfCharset = Charset.forName("UTF-16LE");<o:p></o:p>
CharsetEncoder encoder = utfCharset.newEncoder();<o:p></o:p>
ByteBuffer utfBytes = null;<o:p></o:p>
try {<o:p></o:p>
|
分享到:
相关推荐
3. **转换编码**:如果源编码与目标编码不同,可以使用`String`的`getBytes()`和`new String()`方法,或`CharsetEncoder`和`CharsetDecoder`,进行编码转换。 4. **写入新文件**:将转换后的内容写入新的文件,指定...
根据提供的文件信息,本文将详细解释Java中字符串的不同编码转换方法及原理,并深入探讨每种编码格式的特点。 ### Java字符串的编码转换 在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理...
在Java DB中,省市区编码表是一个用于存储中国省级、市级和区县级行政区域编码的数据结构,常用于地理信息系统、地址管理或者与地理位置相关的应用程序。这个表通常包含四个字段:`id`、`areaid`、`area` 和 `...
对于解密过程,基本步骤与加密类似,只是需要调用`cipher.init(Cipher.DECRYPT_MODE, key)`初始化Cipher对象用于解密模式,然后用`cipher.doFinal()`方法解密已加密的字节数组。 总结来说,这个Java示例展示了如何...
本文将详细讲解如何在Java环境中实现TLV的编码与解码,并结合提供的`ber-tlv`资源进行分析。 TLV结构简单明了,由三个部分组成: 1. **Tag**:标识数据的类型或者含义,通常是一个整数。 2. **Length**:表示Value...
首先,Java中的`Charset`类是处理字符编码的基础,它提供了识别和转换字符集的方法。然而,Java标准库并没有提供一种直接的自动检测文件编码的方法。通常,开发者需要借助第三方库或者自定义算法来实现这个功能。 ...
Java 文件转换应用源码项目是一个基于Java 1.8开发的实用工具,它提供了丰富的文件转换功能,包括PDF与Word之间的互相转换、图像格式转换、PDF转为图片以及Base64编码与文件之间的相互转换。这个项目对于需要处理...
Java提供的标准库支持多种编码转换,但直接操作起来可能会比较复杂,因此这类工具类的出现,简化了编码检测和转换的过程。 在Java中,`java.nio.charset`包提供了对字符编码的支持,如`Charset`类用于表示字符集,`...
5. **简繁体转换**:Java可以使用OpenCC或ICU4J库进行简体与繁体中文的转换。OpenCC是轻量级的开源库,专门处理简繁体转换,而ICU4J是Unicode和国际化相关的Java库,功能更为强大,不仅支持简繁转换,还支持多种语言...
更复杂的方法是利用第三方库,如ICU4J (International Components for Unicode for Java),它提供了`org.apache.commons.lang3.CharEncoding`类,包含了一个`detectCharset`方法,可以基于字节模式识别编码。...
在Java中,我们通常需要将文本信息转换为PDU格式,以便短信猫能够理解和处理。 在给定的文件列表中,`prepare.java`可能包含了初始化设置,如配置串口参数、建立与短信猫的连接等。`OperatComm.java`可能包含了操作...
在Java编程语言中,处理简体与繁体字的互换是一个常见的需求,尤其是在处理中文文本或者进行跨地区交流时。这个"java 简繁字互转换DEMO"提供了一个示例,帮助开发者理解如何实现这样的功能。下面将详细探讨相关知识...
2. 初始化`Qrcode`对象:创建一个`Qrcode`实例,并设置错误校正级别(例如,'M'表示中等错误校正),编码模式('B'表示二进制模式),以及版本号(例如,7表示版本7的二维码,可存储最多7089个数据位)。 3. 将内容...
此外,适配器模式可以将不兼容的接口转换为可以协同工作的接口,而代理模式则可以为其他对象提供一种代理以控制对这个对象的访问。 本书详细阐述了每种模式的意图、结构、参与者以及实现方式,同时通过实例代码演示...
通过阅读和理解这段代码,你可以学习到如何在Java中处理不同编码的文件,以及如何在不确定编码的情况下进行探测和转换。 总之,理解字符编码以及如何在Java中处理它们是每个开发者的必备技能。无论是处理本地化文本...
4. **编程语言中的编码处理**:在编程中,语言如Python、Java、C#等都有处理编码转换的库和函数。例如Python的`codecs`库,可以方便地进行编码转换操作。 5. **文件编码的识别**:在处理未知编码的文件时,需要先...
### Java设计模式之适配器模式详解 #### 结构型模式概述 在软件工程领域,设计模式被视为一种标准解决方案,用于解决在特定上下文中经常出现的问题。设计模式按其目的和适用场景,大致可分为三种类型:创建型模式...
在Java中,简单工厂、工厂方法和抽象工厂模式各有不同的适用场景,可以避免硬编码类名,提高代码的灵活性。 三、建造者模式(Builder) 建造者模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的...
`TxtEncodingDetect.java`可能就是基于这样的机制,通过分析文件的字节模式来推测其编码。例如,GBK编码的文件头通常会有特定的字节序列,而UTF-8文件可能会包含BOM(字节顺序标记)。 2. **字节流与字符流**:在...
Java编程语言以其强大的功能和广泛的应用领域而深受程序员喜爱,但是,为了保证代码的质量和团队间的协作效率,一套良好的编码规范至关重要。本压缩包“java编码规范.zip”提供了华为版的编码规范和一个详细的Java...