String的getBytes()方法是得到一个字串的字节数组,这是众所周知的。但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组。如果你在使用这个方法时不考虑到这一点,你会发现在一个平台上运行良好的系统,放到另外一台机器后会产生意想不到的问题。比如下面的程序:
class TestCharset
{
public static void main(String[] args)
{
new TestCharset().execute();
}
private void execute() {
String s = "Hello!你好!";
byte[] bytes = s.getBytes();
System.out.println("bytes
lenght is:" + bytes.length);
}
}
在一个中文WindowsXP系统下,运行时,结果为:
bytes lenght is:12
但是如果放到了一个英文的UNIX环境下运行:
$ java TestCharset
bytes lenght is:9
如果你的程序依赖于该结果,将在后续操作中引起问题。为什么在一个系统中结果为12,而在另外一个却变成了9了呢?上面已经提到了,该方法是和平台(编码)相关的。
在中文操作系统中,getBytes方法返回的是一个GBK或者GB2312的中文编码的字节数组,其中中文字符,各占两个字节。而在英文平台中,一般的默认编码是“ISO-8859-1”,每个字符都只取一个字节(而不管是否非拉丁字符)。
Java中的编码支持
Java是支持多国编码的,在Java中,字符都是以Unicode进行存储的,比如,“你”字的Unicode编码是“4f60”,我们可以通过下面的实验代码来验证:
class TestCharset
{
public static void main(String[] args)
{
char c = '你';
int i = c;
System.out.println(c);
System.out.println(i);
}
}
不管你在任何平台上执行,都会有相同的输出:
20320
20320就是Unicode “4f60”的整数值。其实,你可以反编译上面的类,可以发现在生成的.class文件中字符“你”(或者其它任何中文字串)本身就是以Unicode编码进行存储的:
char c = '\u4F60';
... ...
即使你知道了编码的编码格式,比如:
javac -encoding GBK TestCharset.java
编译后生成的.class文件中仍然是以Unicode格式存储中文字符或字符串的。使用String.getBytes(String charset)方法
所以,为了避免这种问题,我建议大家都在编码中使用String.getBytes(String charset)方法。下面我们将从字串分别提取ISO-8859-1和GBK两种编码格式的字节数组,看看会有什么结果:
class TestCharset
{
public static void main(String[] args)
{
new TestCharset().execute();
}
private void execute() {
String s = "Hello!你好!";
byte[] bytesISO8859 =null;
byte[] bytesGBK = null;
try
{
bytesISO8859 =
s.getBytes("iso-8859-1");
bytesGBK = s.getBytes("GBK");
}
catch
(java.io.UnsupportedEncodingException e)
{
e.printStackTrace();
}
System.out.println
("--------------
\n 8859 bytes:");
System.out.println("bytes is: " + arrayToString(bytesISO8859));
System.out.println("hex format is:"
+ encodeHex(bytesISO8859));
System.out.println();
System.out.println
("--------------
\n GBK bytes:");
System.out.println("bytes is:
" + arrayToString(bytesGBK));
System.out.println("hex format
is:" + encodeHex(bytesGBK));
}
public static final String
encodeHex (byte[] bytes)
{
StringBuffer buff =
new StringBuffer(bytes.length * 2);
String b;
for (int i=0; i< bytes.length ; i++)
{
b = Integer.toHexString(bytes[i]);
// byte是两个字节的,
而上面的Integer.toHexString会把字节扩展为4个字节
buff.append(b.length() > 2 ? b.substring(6,8) : b);
buff.append(" ");
}
return buff.toString();
}
public static final String
arrayToString (byte[] bytes)
{
StringBuffer buff = new StringBuffer();
for (int i=0; i< bytes.length ; i++)
{
buff.append(bytes[i] + " ");
}
return buff.toString();
}
}
执行上面程序将打印出:
--------------
8859 bytes:
bytes is: 72 101 108 108 111 33 63 63 63
hex format is:48 65 6c 6c 6f 21 3f 3f 3f
--------------
GBK bytes:
bytes is: 72 101 108 108 111 33
-60 -29 -70 -61 -93 -95
hex format is:48 65 6c 6c 6f 21 c4 e3 ba c3 a3 a1
可见,在s中提取的8859-1格式的字节数组长度为9,中文字符都变成了“63”,ASCII码为63的是“?”,一些国外的程序在国内中文环境下运行时,经常出现乱码,上面布满了“?”,就是因为编码没有进行正确处理的结果。
而提取的GBK编码的字节数组中正确得到了中文字符的GBK编码。字符“你”“好”“!”的GBK编码分别是:“c4e3”“bac3”“a3a1”。得到了正确的以GBK编码的字节数组,以后需要还原为中文字串时,可以使用下面方法:
new String(byte[] bytes,
String charset)
分享到:
相关推荐
### Java中的String类getBytes()方法详解与实例 #### 简介 在Java编程语言中,`String`类是处理文本数据的核心类之一。它表示一个不可变的字符序列,这意味着一旦创建了一个`String`对象,其内容就不能被更改。在...
在Java编程语言中,`...通过阅读和分析`TestString.java`文件,我们可以看到这些方法在实际代码中的应用,从而加深对它们的理解。在进行字符串操作时,应根据具体需求选择合适的方法,以优化性能和提高代码可读性。
这里我们将深入探讨`String`类的一些重要方法及其在Android开发中的应用。 1. **创建与初始化String对象** - `new String()`: 使用此构造函数创建新的字符串对象。 - `""`: 字符串字面量,如`String str = "Hello...
在Java编程语言中,`char`和`String`是处理...理解和熟练使用这些方法是Java编程的基本功,对于开发涉及文本处理的应用尤其关键。通过深入学习和实践,开发者可以更有效地实现各种文本操作,提高代码的可读性和性能。
在C#编程语言中,字符串(string)与字节...综上所述,在C#中进行字符串与字节/字节数组之间的转换时,开发者可以根据实际应用场景选择最适合的方法。理解这些转换背后的原理和细节对于编写高效、可靠的代码至关重要。
本文将对 `String` 类中的方法进行详细介绍,并提供它们的功能概述与应用场景,旨在帮助开发者更好地理解和应用这些方法。 #### 1. `charAt(int index)` **功能描述**:返回指定索引位置上的字符。 **示例**: ``...
在Java和Android中,将字节数组转换为字符串最常用的方法是使用`new String(byte[])`构造函数。此方法会使用平台默认的字符编码,这可能会导致在不同系统上显示不同的结果。为了避免这个问题,我们通常指定一个明确...
此外,Java和Python的`String`类都有许多其他的方法,如比较方法(equals()、compareTo())、查找方法(startsWith()、endsWith()、contains())、格式化方法(format())以及编码和解码方法(getBytes()、decode()...
public static byte[] GetBytes(string hexString, out int discarded) { discarded = 0; string newString = ""; char c; // remove all none A-F, 0-9, characters for (int i = 0; i < hexString.Length; i+...
byte[] byteArray = inputString.getBytes(); ByteArrayInputStream bais = new ByteArrayInputStream(byteArray); ``` - 使用`PipedInputStream`和`PipedOutputStream`:这种方法涉及创建管道来传输数据,可以...
在 Java 中,String 类型可以使用 getBytes() 方法将字符串转换为 byte[] 数组,但是这种方法有可能会出现乱码问题,因为 getBytes() 方法使用平台默认的编码方式,这可能会导致乱码问题。为了避免这种问题,我们...
- `getBytes()`: `String`类提供了一个`getBytes()`方法来将字符串转换为字节数组。如果不指定字符集,则使用平台默认的字符集进行编码。 - `getBytes(String charsetName)`: 可以通过指定字符集名称的方式进行...
答案:String > byte[] 通过 String 类的 getBytes 方法;byte[] > String 通过 new String(byte[]) 构造器。String 和 byte[] 之间的转换非常常用,在实际应用中经常用到。 这 10 个 Java 经典的 String 面试题...
- **字面量转换**: 直接使用`getBytes()`方法将字符串转化为字节数组。例如,`byte[] bytes = "Hello".getBytes();` 这个方法使用平台默认的字符编码,如果需要特定编码(如UTF-8),可以传递编码名称作为参数,如`...
在这个场景中,`base64`、`decodeBase64`和`encodeBase64String`相关的包和方法,都是Apache Commons Codec库的一部分。 1. **Base64编码**: `encodeBase64String()`方法是用于将字节数组编码为Base64字符串的。它...
在Android开发中,字符编码是一个重要的考虑因素,尤其是在处理中文字符时。GBK是GB2312编码的一个...合理地运用上述方法,能够帮助Android开发者在处理GBK编码数据时避免这类问题,从而提高应用的兼容性和用户体验。
在实际应用中,这些转换方法可能会根据具体需求进行调整,例如处理特定的字符编码或者处理包含特殊字符的字符串。理解并掌握这些基本的转换技巧对于任何IT开发者来说都是非常重要的,特别是在处理数据的存储、传输和...
System.out.println(new String(content.getBytes(), "utf-8")); in.close(); } } ``` 在上面的代码中,我们使用 `BufferedReader` 对象来读取 Word 文档的内容,然后将其存储在 `content` 变量中。最后,我们将...
在ASP.NET C#开发环境中,处理字符串是一项常见且重要的任务,尤其是在需要对字符串进行...这种扩展方法不仅提高了代码的灵活性,还增强了对复杂字符串数据的处理能力,对于构建高效、稳定的Web应用程序具有重要意义。
value = new String(value.getBytes("ISO-8859-1"), "UTF-8"); // 其他业务逻辑... } } ``` 通过以上步骤,大部分情况下可以解决Struts框架下的中文乱码问题。然而,具体问题可能需要具体分析,有时还需要检查...