无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题。尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312。
一、关键技术点:
1、当前流行的字符编码格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是专门处理中文编码的。
2、String的getBytes方法用于按指定编码获取字符串的字节数组,参数指定了解码格式,如果没有指定解码格式,则按系统默认编码格式。
3、String的“String(bytes[] bs, String charset)”构造方法用于把字节数组按指定的格式组合成一个字符串对象
二、实例演示:
Java代码
package book.String;
import java.io.UnsupportedEncodingException;
/** *//**
* 转换字符串的编码
* @author joe
*
*/
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 转换格式,Litter 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";
public static final String GB2312 = "GB2312";
/** *//** 将字符编码转换成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);
}
/** *//** 将字符编码转换成GB2312 */
public String toGB2312(String str) throws UnsupportedEncodingException {
return this.changeCharset(str,GB2312);
}
/** *//**
* 字符串编码转换的实现方法
* @param str 待转换的字符串
* @param newCharset 目标编码
*/
public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException ...{
if(str != null) {
//用默认字符编码解码字符串。与系统相关,中文windows默认为GB2312
byte[] bs = str.getBytes();
return new String(bs, newCharset); //用新的字符编码生成字符串
}
return null;
}
/** *//**
* 字符串编码转换的实现方法
* @param str 待转换的字符串
* @param oldCharset 源字符集
* @param newCharset 目标字符集
*/
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);
System.out.println();
String iso88591 = test.toISO_8859_1(str);
System.out.println("转换成ISO-8859-1码:" + iso88591);
System.out.println();
gbk = test.changeCharset(iso88591, ISO_8859_1, GBK);
System.out.println("再把ISO-8859-1码的字符串转换成GBK码:" + gbk);
System.out.println();
String utf8 = test.toUTF_8(str);
System.out.println();
System.out.println("转换成UTF-8码:" + utf8);
String utf16be = test.toUTF_16BE(str);
System.out.println("转换成UTF-16BE码:" + utf16be);
gbk = test.changeCharset(utf16be, UTF_16BE, 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, UTF_16LE, GBK);
System.out.println("再把UTF-16LE编码的字符串转换成GBK码:" + gbk);
System.out.println();
String utf16 = test.toUTF_16(str);
System.out.println("转换成UTF-16码:" + utf16);
String gb2312 = test.changeCharset(utf16, UTF_16, GB2312);
System.out.println("再把UTF-16编码的字符串转换成GB2312码:" + gb2312);
}
}
輸出結果:
Java代码
str:This is a 中文的 String!
转换成GBK码:This is a 中文的 String!
转换成US-ASCII:This is a ?????? String!
转换成ISO-8859-1码:This is a ?????? String!
再把ISO-8859-1码的字符串转换成GBK码:This is a 中文的 String!
转换成UTF-8码:This is a ????? String!
转换成UTF-16BE码:周楳?猠愠????瑲楮朡
再把UTF-16BE编码的字符转换成GBK码:This is a 中文的 String!
转换成UTF-16LE码:桔獩椠?????匠牴湩Ⅷ
再把UTF-16LE编码的字符串转换成GBK码:This is a 中文的 String!
转换成UTF-16码:周楳?猠愠????瑲楮朡
再把UTF-16编码的字符串转换成GB2312码:?This is a 中文的 String!
str:This is a 中文的 String!
转换成GBK码:This is a 中文的 String!
转换成US-ASCII:This is a ?????? String!
转换成ISO-8859-1码:This is a ?????? String!
再把ISO-8859-1码的字符串转换成GBK码:This is a 中文的 String!
转换成UTF-8码:This is a ????? String!
转换成UTF-16BE码:周楳?猠愠????瑲楮朡
再把UTF-16BE编码的字符转换成GBK码:This is a 中文的 String!
转换成UTF-16LE码:桔獩椠?????匠牴湩Ⅷ
再把UTF-16LE编码的字符串转换成GBK码:This is a 中文的 String!
转换成UTF-16码:周楳?猠愠????瑲楮朡
再把UTF-16编码的字符串转换成GB2312码:?This is a 中文的 String!
三、源码分析:
更改字符串编码的步骤为:
1、调用String的getByte方法对字符串进行解码,得到字符串的字节数组(字节数组不携带任何有关编码格式的信息,只有字符才有编码格式)
2、根据字节数组和新的字符编码构造一个新的String对象,得到的就是按照新的字符编码生成的字符串
此文转自:http://blog.csdn.net/zhouyong80/archive/2007/11/24/1900100.aspx
分享到:
相关推荐
在Java编程语言中,字符串...以上只是Java字符串操作的一小部分,实际开发中还有许多其他方法和特性,如国际化(I18N)、正则表达式等,都需要程序员灵活掌握。理解并熟练运用这些操作,能有效提高代码质量和效率。
1. **创建字符数组**:将字符串转换为字符数组,因为数组可以被排序。我们可以使用`toCharArray()`方法完成这个转换。 2. **排序字符数组**:利用Java内置的排序方法,如`Arrays.sort()`,对字符数组进行排序。默认...
- `toUpperCase()`/`toLowerCase()`: 将字符串转换为大写或小写。 - `equals(Object obj)`/`equalsIgnoreCase(String anotherString)`: 比较字符串内容是否相等,`equalsIgnoreCase`忽略大小写。 - `replace(char...
### JAVA字符串处理函数列表一览 在Java编程语言中,字符串处理是极其常见且重要的操作之一。字符串类`String`提供了丰富的内置方法来帮助开发者高效地完成各种字符串操作任务。本文将详细解读`String`类中的一些...
### Java 获取随机字符串 在Java开发中,生成随机字符串是一个非常常见的需求,尤其是在密码学、安全验证、数据加密等场景中。本文将详细介绍如何在Java中生成随机字符串,并且会结合给定的部分代码示例进行深入...
### Java.util.Date与Java.sql.Date互转及字符串转换为日期时间格式 #### 一、Java.util.Date与Java.sql.Date的基本概念 在Java编程语言中,处理日期和时间时经常使用到`java.util.Date`和`java.sql.Date`这两个类...
1. **解析字符串**:将输入的字符串转换为可理解的数据结构,如抽象语法树(AST)。这可以通过递归下降解析或使用现成的解析库如JavaCC或ANTLR来完成。 2. **处理运算符优先级**:确保正确的运算顺序,比如遵循...
3. **字符串转换**:Java在进行连接时会自动调用`toString()`方法将非字符串数据类型转换为字符串形式。例如: ```java String s = "four: " + 2 + 2; // 结果为 "four: 22" String s = "four: " + (2 + 2); // ...
### Java处理字符和字符串知识点详解 #### 一、概述 在Java编程中,字符和字符串是最常见的数据类型之一。为了方便高效地处理这些数据类型,Java提供了强大的支持,包括`Character`类和`String`类等。这些类位于`...
在提供的`xmlToObj.java`文件中,可能包含一个示例,演示如何使用反射和XML解析技术将XML字符串转换回Java对象。可能的实现是先使用XML解析库(如JAXB或DOM)将XML字符串解析成DOM树,然后通过反射找到对应的类并...
这些标签虽然没有直接关联于Java字符串,但它们代表了广泛的IT知识领域,表明这份文档可能适合各种技术水平的读者,从初学者到有一定经验的开发者,无论是对数据处理、硬件编程(如STM32,一种常见的微控制器)、...
#### 二、Java字符串排序方法 在Java中,可以通过多种方式实现字符串排序,包括但不限于使用内置的`Collections.sort()`方法(适用于可变字符序列如`ArrayList<Character>`)、自定义比较器以及编写专门的排序算法...
### Java字符串处理详解 在Java编程中,字符串的处理是一项基本而重要的技能,尤其是在文本处理、数据解析和用户界面交互等场景中。本篇将基于《java字符串的处理.pdf》的内容,深入探讨Java中字符串的基本概念、...
4. **编译器/解释器支持**:不是所有语言都支持直接将字符串转换为 Lambda。有些语言提供了内置的机制,如 Python 的 `eval` 函数,或者 C# 的 `Expression` 类型,而其他语言可能需要使用第三方库或自定义解析器来...
本资料将深入探讨Java字符串中常用的方法。 1. **创建字符串** - `new String()`: 通过构造函数创建,可以传入字符数组或另一个字符串。 - `""`: 字符串字面量,例如 `"Hello"`,Java会自动在字符串池中创建一个...
### JAVA字符串处理函数详解 #### 一、substring() 在Java中,`substring()` 方法用于从字符串中截取子串。该方法有两种形式: 1. **`String substring(int startIndex)`** - **作用**:返回从指定索引 `...
标题中的“编程相关 原创字符串转换小工具”表明这是一个专门为编程人员设计的实用工具,专注于处理字符串的转换操作。在计算机编程中,字符串处理是至关重要的,无论是数据分析、文本解析还是用户输入验证,都会...
标题与描述“java String类型转换成整数double”以及标签“String类型转换成double”均指向了这一核心操作——如何将一个表示数字的字符串转换为Java中的数值类型。 ### 1. 使用`parseXxx`方法进行转换 #### `...
// 将JSON字符串转换为对象 YourClass yourObject = JSON.parseObject(jsonString, YourClass.class); ``` 4. 遇到的常见问题: - **序列化/反序列化的异常**:如果对象的属性包含不可序列化的类型(如`...
6. **字符串转换**: FreeMarker提供了`?html`、`?url`等转换器,可以将字符串转义为安全的HTML或URL。例如: ```html <#assign unsafeStr = "<script>alert('XSS');</script>"> ${unsafeStr?html}</p> ``` ...