在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同OS下,返回的东西不一样!
String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如:
byte[] b_gbk = "深".getBytes("GBK"); byte[] b_utf8 = "深".getBytes("UTF-8"); byte[] b_iso88591 = "深".getBytes("ISO8859-1"); byte[] b_unicode = "深".getBytes("unicode");
将分别返回“深”这个汉字在GBK、UTF-8、ISO8859-1和unicode编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1,unicode为4。
而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“深”字时,这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串。
String s_gbk = new String(b_gbk,"GBK"); String s_utf8 = new String(b_utf8,"UTF-8"); String s_iso88591 = new String(b_iso88591,"ISO8859-1"); String s_unicode = new String(b_unicode, "unicode");
通过打印s_gbk、s_utf8、s_iso88591和unicode,会发现,s_gbk、s_utf8和unicode都是“深”,而只有s_iso88591是一个不认识的字符,为什么使用ISO8859-1编码再组合之后,无法还原“深”字呢,其实原因很简单,因为ISO8859-1编码的编码表中,根本就没有包含汉字字符,当然也就无法通过"深".getBytes("ISO8859-1");来得到正确的“深”字在ISO8859-1中的编码值了,所以再通过new String()来还原就无从谈起了。
因此,通过String.getBytes(String decode)方法来得到byte[]时,一定要确定decode的编码表中确实存在String表示的码值,这样得到的byte[]数组才能正确被还原。
有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码),可能会通过将中文字符按照字节方式来编码的情况,如
String s_iso88591 = new String("深".getBytes("UTF-8"),"ISO8859-1"),
这样得到的s_iso8859-1字符串实际是三个在 ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来得到正确的中文汉字“深”。这样就既保证了遵守协议规定、也支持中文。
同样,在开发会检查字符长度,以免数据库字段的长度不够而报错,考虑到中英文的差异,肯定不能用String.length()方法判断,而需采用String.getBytes().length;而本方法将返回该操作系统默认的编码格式的字节数组。如字符串“Hello!你好!”,在一个中文WindowsXP系统下,结果为12,而在英文的UNIX环境下,结果将为9。因为该方法和平台(编码)相关的。在中文操作系统中,getBytes方法返回的是一个GBK或者GB2312的中文编码的字节数组,其中中文字符,各占两个字节,而在英文平台中,一般的默认编码是"ISO-8859-1",每个字符都只取一个字节(而不管是否非拉丁字符)。所以在这种情况下,应该给其传入字符编码字符串,即String.getBytes("GBK").length。
附:如下语句在Eclipse中,能正确读取当前JAVA文件的字符编码。
java.security.PrivilegedAction pa = new GetPropertyAction("file.encoding"); String csn = (String)AccessController.doPrivileged(pa); System.out.println(csn);
相关推荐
### Java中的String类getBytes()方法详解与实例 #### 简介 在Java编程语言中,`String`类是处理文本数据的核心类之一。它表示一个不可变的字符序列,这意味着一旦创建了一个`String`对象,其内容就不能被更改。在...
这可以通过`java.net.URL`类的`openConnection()`方法实现: ```java URL url = new URL("http://target.com/api"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); ``` 2. **...
### JAVA中三种URL连接方法详解 #### 引言 在JAVA编程中,处理网络资源的能力是必不可少的。通过JAVA的`java.net`包,开发者能够轻松地与远程服务器交互,获取或发送数据。本文将深入探讨JAVA中三种常见的URL连接...
Java避免UTF-8的csv文件打开中文出现乱码的方法 在Java中,避免UTF-8的csv文件打开中文出现乱码的方法是非常重要的。csv文件是 comma separated values 的缩写,常用于数据交换和导入导出操作。然而,在Java中读取...
Java的`getBytes()`方法允许指定字符编码,如`"UTF8"`,来确保正确处理多语言字符。解密后,再将字节数组转换回字符串。 4. **加密和解密方法**:`crypt()`方法接受内容、密码和操作标志(1代表加密,2代表解密)。...
在Java服务器端,使用`ServerSocket`的`accept`方法创建`Socket`,并使用`DataInputStream`来读取客户端发送的数据。由于C++可能使用GBK编码,因此在读取数据后,需要将接收到的字节数组转换为`String`时指定GBK编码...
本篇将详细讲解Base64的Java实现方法,以及如何在实际开发中应用。 Base64的基本原理是将每3个字节(24位)的数据转换为4个Base64字符(每个6位),不足3个字节的数据会在末尾填充0,并在编码结果中用'='表示。Base...
Java 乱码问题解决方法 Java 乱码问题是 Java 开发中常见的问题之一,解决这个问题需要了解 Java 的编码方式、JSP 中文乱码问题、Tomcat 5.5 中文乱码问题、JDBC ODBC Bridge 的 Bug 及其解决方法、Solaris 下 ...
本文将深入探讨Java中的一些常用字符串方法,帮助你更好地理解和运用它们。 1. **创建字符串对象** 在Java中,有多种方式来创建字符串对象,如通过`new`关键字、使用`String`字面量或者通过`StringBuffer/...
C# 加密 JAVA 解密源码 using System; using System.IO; using System.Security.Cryptography; namespace WindowsApplication1 { /// /// Security 的摘要说明。 /// public class Security { const string...
国密算法SM4纯java代码实现,支持: SM4Enc_ECB(str.getBytes(), key.getBytes()); SM4Dec_ECB(bts,key.getBytes()); SM4Enc_CBC(str.getBytes(),iv.getBytes(), key.getBytes()); SM4Dec_CBC(bts,iv.getBytes(),key...
Java作为一种广泛应用的编程语言,提供了多种密码加密方法来确保数据的安全性。...在`CodeUtil.java`文件中,你可以看到如何在Java程序中实现这两种加密方法,这对于理解和应用密码学原理非常有帮助。
"java+MongoDB实现存图片、下载图片的方法示例" 本文主要介绍了使用java和MongoDB实现存图片和下载图片的方法,并结合实例形式详细分析了java结合MongoDB实现图片的存储和下载相关操作技巧。 Java和MongoDB简介 ...
在上面的代码中,我们可以看到C#使用System.Text.Encoding.UTF8.GetBytes方法将字符串转换为字节数组,而Java使用getBytes方法将字符串转换为字节数组。但是,这两种方法的输出结果不同。C#的输出结果为[230, 136, ...
在Java编程中,掌握一些常用的方法对于提升开发效率和代码质量至关重要。本篇文章将围绕"java常用方法转换时间等等"这一主题,详细讲解Java中处理时间、算法、加密解密以及数据库连接等核心知识点。 首先,让我们从...
return cipher.doFinal(plainText.getBytes()); } } ``` 解密则需要用到私钥,使用`java.security.spec.RSAPrivateKeySpec`和相同的`Cipher`类: ```java import javax.crypto.Cipher; import java.security....
2. **程序中转换**:在代码中,可以使用`new String(youChineseString.getBytes("ISO-8859-1"), "GBK")`将字节序列从ISO-8859-1编码转换为GBK编码,从而正确解码中文字符。 在Web环境中加载资源文件,通常有两种...
- **一次转码**:使用`encodeURI()` 对URL进行编码,然后在服务器端使用适当的解码方法,如Java中的`new String(name.getBytes("ISO-8859-1"), "UTF-8")`,确保从ISO-8859-1转回UTF-8。 - **二次转码**:先使用`...
Java还提供了`String`类的`getBytes()`和`new String(byte[], charset)`方法来处理字符集。`getBytes()`会根据默认字符集编码字符串为字节数组,而`new String(byte[], charset)`则可以指定字符集解码字节数组: ``...
这里我们将深入探讨Java中的Base64加密和解密方法,以及如何使用提供的`Encoder.java`和`Decoder.java`工具类。 首先,Base64加密(编码)是将原始数据转换成Base64格式的过程。在Java 8及以上版本中,`java.util....