Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。
unicode utf-8转换
在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码
WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码
DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码
这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要两个WORD,大小是4个字节。“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。
UTF-8
UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(16进制) ║ UTF-8 字节流(二进制)
000000 - 00007F ║ 0xxxxxxx
000080 - 0007FF ║ 110xxxxx 10xxxxxx
000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,十六进制E6 B1 89,转换成10进制就是230 177 137.
String.getBytes()的结果是怎么得到的呢? 上面结果是unsigned char,用-(256-x)再转换成signed char就是-26, -79, -119,也就是String.getBytes()的结果了
汉字的Utf8编码都是三字节的,即:
000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
三个字节中最小值为128,转换成signed char就是负数了,所以汉字的String.getBytes()得到的一定是负数
分享到:
相关推荐
例如,如果数据库是UTF-8,JSP是GBK,可以使用 `new String(rs.getBytes(1),"UTF-8")` 将数据库中的UTF-8字节流转换为GBK字符串。反之,如果JSP是UTF-8,数据库是GBK,需要先将GBK字符串转换为字节流,然后再次转换...
- **Java**:使用`java.nio.charset.Charset`类,如`new String(fileBytes, "GBK").getBytes("UTF-8")`。 - **JavaScript**:可以借助第三方库如`iconv-lite`,但在浏览器环境中需注意文件读取限制。 5. **在线...
《明解Java-UTF-8》是一门针对Java编程语言和UTF-8编码的课程,其课后提供的源代码旨在帮助学习者巩固所学知识,适用于初学者和希望深入理解Java的同学。UTF-8是一种广泛使用的字符编码标准,能够表示Unicode字符...
Files.write(Paths.get(targetFilePath), content.getBytes(Charset.forName("UTF-8"))); // 如果是文件夹,则需要更改文件名的编码 if (Files.isDirectory(sourcePath)) { String oldName = sourcePath....
sms = new String(sms.getBytes("utf-8"), "gbk"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sms; } ``` - **`main`方法**:在主...
### JAVA字符编码详解:Unicode, ISO-8859-1, GBK, UTF-8 及其相互转换 #### 一、引言 在Java编程中,字符编码的管理和转换是一项基本而又重要的任务。不同的编码标准适用于不同的场景,而理解和掌握这些编码之间...
在Java中,String类也是用于存储和操作字符序列,同样支持UTF-8编码。 实现UTF-8与字符串之间的转换通常需要特定的函数或方法。在Python中,你可以使用内置的`encode`和`decode`函数进行转换: ```python # 字符串...
String unicodeStr = new String(utf8Str.getBytes("UTF-8"), "UTF-8"); ``` #### 6. 示例分析 - **从GBK到ISO-8859-1**: - 当从GBK编码转换到ISO-8859-1编码时,如果原字符不在ISO-8859-1的字符集范围内,则会...
在Java中,`String`类的`getBytes()`方法可以将字符串转换为字节数组,但默认编码通常是平台的默认编码,可能不是UTF-8。为了确保使用UTF-8编码,我们需要指定`Charset`参数,如`getBytes("UTF-8")`。 以下是一个...
- **CharEncoding**:定义了各种字符编码的常量,如ISO-8859-1、UTF-8等,方便在编码和解码时使用。 3. **使用示例** 使用Apache Commons Codec库非常简单,以下是一些基本示例: ```java import org.apache....
但是,这种方法存在一些问题,例如,使用new String(tmp.getBytes("GBK"), "UTF-8")这种方法将GBK编码的字符串转换成UTF-8编码的字符串时,可能会出现乱码的问题。 出现这种问题的原因是,因为客户端使用GBK编码,...
- 编码和解码:支持不同字符编码的转换,如UTF-8、GBK等。 - 数据转换:如将字节流转为字符串,反之亦然。 2. **关键类和方法**: - `FileUtils`:提供了一系列静态方法,用于执行文件操作,如`copyFile()`、`...
- **一次转码**:使用`encodeURI()` 对URL进行编码,然后在服务器端使用适当的解码方法,如Java中的`new String(name.getBytes("ISO-8859-1"), "UTF-8")`,确保从ISO-8859-1转回UTF-8。 - **二次转码**:先使用`...
### 知识点总结 #### 一、UTF-8 编码原理与16...对于实际应用来说,通常可以直接使用 Java 内置的方法如 `new String(bytes, "UTF-8")` 或 `string.getBytes("GB2312")` 进行编码转换,这些方法更加简洁且易于理解。
- 将字符串`"中文"`从Unicode转换为UTF-8编码:`String s = "中文"; byte[] utf8s = s.getBytes("UTF-8");` - 将UTF-8编码的字节数组转换为Unicode字符串:`byte[] utf8s = {0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87};...
字符编码问题常常出现在不同系统之间进行数据交换时,例如,一个使用GBK编码的Java程序发送数据到使用UTF-8编码的服务器,如果没有正确处理编码转换,可能会出现乱码。因此,理解并掌握字符集编码对于处理跨平台的...
例如,使用`new InputStreamReader(fileInputStream, "UTF-8")`来读取文件,使用`String.getBytes("UTF-8")`来获取字节数组。 4. **JVM字符集设置**:在启动Java虚拟机(JVM)时,可以使用`-Dfile.encoding=UTF-8`...
UTF-8(8位Unicode Transformation Format)是一种广泛使用的Unicode字符编码方案,它可以表示Unicode字符集中所有的字符。UTF-8的最大特点是其字节顺序与字节值是独立的,这意味着它具有很好的网络传输特性,且在...
而UTF-8是一种变长编码,可以表示Unicode字符集中的所有字符,包括中文、日文、韩文等。 在Java中,当我们从客户端接收数据时,有时数据可能是按照ISO-8859-1编码的。如果我们要正确处理这些数据,需要将其转换为...