CharBuffer是java.nio下面的一个字符缓存类,一般情况下,我么用不到它。平时都会用ByteBuffer代替。
没事的时候,研究一下,发现CharBuffer在编码转换上有奇怪的问题。
获取CharBuffer对象方法有
ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
byteBuffer.put("测试字符aabc".getBytes());
byteBuffer.asCharBuffer();
CharBuffer charBuffer=CharBuffer.wrap();
CharBuffer charBuffer=CharBuffer.allocate();
使用误区:
有人认为可以把ByteBuffer转换为字符串,直接通过下面的方法。
byteBuffer.asCharBuffer().toString();
这样是错误的。(除非你存放在byteBuffer中的字节是utf-16be,就可以正常输出)
如果存放在byteBuffer中的字节不是utf-16be的,那么通过asCharBuffer方法转换为CharBuffer后,怎么正确输出。
测试代码如下:
package com.cgb.train.core.nio; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; public class CharBufferTest2 { /** * @param args * @throws UnsupportedEncodingException */ public static void main(String[] args) throws UnsupportedEncodingException { // TODO Auto-generated method stub String s="我们abc"; ByteBuffer byteBuffer1=ByteBuffer.allocate(50); ByteBuffer byteBuffer2=ByteBuffer.allocate(50); byteBuffer1.put(s.getBytes("UTF-16BE"));//使用utf-16be字符编码 byteBuffer1.flip();//注意put后,position会发生位置改变。为读做好准备。 byteBuffer2.put(s.getBytes());//使用默认字符编码 byteBuffer2.flip(); System.out.println(byteBuffer1.asCharBuffer().toString()); /** * 下面输出乱码 */ System.out.println(byteBuffer2.asCharBuffer().toString()); /** * 或者直接用下面的方式输出,也是正常的。 * * ByteBuffer.wrap(s.getBytes执行后,不需要flip,已经为读做好准备了。 * */ System.out.println(ByteBuffer.wrap(s.getBytes("UTF-16BE")).asCharBuffer().toString()); } }
所以对于ByteBuffer中存放UTF-16BE编码的字节时,可以直接使用asCharBuffer()直接转换成字符缓冲。
那么对于不是存放UTF-16BE编码的ByteBuffer,需要使用
CharBuffer charBuffer=Charset.forName("字符编码").decode(byteBuffer)进行转换。
注意事项:
1、对ByteBuffer字节缓冲的视图缓冲例如:CharBuffer、IntBuffer、LongBuffer等进行操作引起位置变化的时候,不会引起底层的ByteBuffer的位置(position,limit,mark等)变化。
2、注意有几个带索引参数的添加数据put(index)和获取数据get(index)方法,是不会改变位置的。
相关推荐
在实际应用中,确保正确选择编码是至关重要的,否则可能会导致乱码问题。因此,理解各种编码之间的关系,以及如何在Java中有效地进行转换,对于开发跨平台的软件尤其关键。 最后,虽然这个示例代码没有涵盖所有可能...
通常,`Test.java`可能是测试类,包含了对字符编码转换功能的验证代码,而`Node.java`可能定义了与字符编码转换相关的数据结构或功能。在阅读这些源码时,我们可以关注以下几个方面: 1. **字符编码识别**:查看...
7. **webservice相关的编码问题**:在处理Web服务(如文件名`webservice_xxjt.txt`可能暗示的)时,XML编码也非常重要。XML声明中可以指定编码,如`<?xml version="1.0" encoding="UTF-8"?>`,且在处理SOAP消息时,...
这段代码创建了一个`convertEncoding`方法,它接受源文件路径、目标文件路径、源编码和目标编码作为参数,通过读取源文件,解码为CharBuffer,再编码为目标编码,然后写入目标文件,从而实现文件编码的转换。...
在Android中,可以使用`CharsetDecoder`和`CharsetEncoder`类来进行编码和解码操作: ```java Charset charsetGb18030 = Charset.forName("GB18030"); CharsetEncoder encoder = charsetGb18030.newEncoder(); ...
// 使用Unicode编码器将CharBuffer编码为UTF-8字节数组 ByteBuffer unicodeBytes = unicodeEncoder.encode(charBuffer); // 将UTF-8字节数组转换回字符串 return new String(unicodeBytes.array(), "UTF-8"); ...
在IT行业中,字符编码是一个非常重要的概念,尤其是在处理多语言数据时。GBK编码是中国大陆广泛使用的汉字编码标准,而UTF-8则是国际上最普遍的Unicode...通过深入理解这些原理和实践,可以更好地应对编码相关的挑战。
这里的主题是"GBK转UTF-8",这是一个关于字符编码格式转换的问题。GBK是中国大陆广泛使用的汉字编码标准,而UTF-8是Unicode的一种变长编码方式,支持全球多种语言,包括汉字,且在互联网上被普遍采用。 GBK全称为...
如果要转换整个文件的编码,可以使用`java.io`或`java.nio.file`包中的类来读取UTF-8编码的文件,转换后写入ASCII编码的文件。 总结来说,"快速转码(UTF-8转ASCII)"是一个常见的编程需求,尤其在Java Web开发中。...
Java编程语言在处理字符编码时,常常涉及到不同的字符集,如...不正确的编码处理可能导致乱码问题,影响用户体验。因此,深入理解Java中的字符编码机制,以及如何在GBK和UTF-8之间进行转换,对于提升软件质量至关重要。
当我们尝试用这些类解压含有中文名的文件时,如果未正确处理字符编码,就会出现乱码或者解压失败。 为了解决这个问题,我们需要确保在读取ZIP文件时正确地设置字符编码。以下是一些关键步骤: 1. **设置正确的字符...
在C#中,`StreamReader` 是用于读取文本文件的主要类,它接受一个编码参数来指定文件的字符编码。例如,如果知道文件是GBK编码,可以这样创建`StreamReader`: ```csharp FileStream aFile = new FileStream(Single...
- `CharsetEncoder`: 字符集编码器类。 - `CharsetDecoder`: 字符集解码器类。 #### 26. **java.rmi** - **用途**: 远程方法调用。 - **关键类**: - `Remote`: 远程接口。 - `UnicastRemoteObject`: 单播远程...
`android.util.Base64`类提供了相关功能。 ### 四、示例应用 在Android开发中,这种转换常见于以下场景: - 存储用户设置或偏好到SharedPreferences时,可能需要将字符串转换为字节数组。 - 文件操作,如读取或...
在Java中,进行字符编码转换可以使用`java.nio.charset`包下的类,如`Charset`、`CharsetDecoder`和`CharsetEncoder`。例如,你可以先读取`a.properties`文件,将内容解码为特定的字符集(如UTF-8),然后使用`...
默认的编码是平台相关的,可以通过Charset类指定特定的字符编码,如UTF-8、GBK等。 7. **对象序列化** Java的序列化机制允许将对象转换为字节流,便于存储或在网络上传输。ObjectInputStream和ObjectOutputStream...
1. 字符和字符串处理:文档中提到了字符编码(Character Encodings)、字符类(CharacterClass)、CharSequence接口、String类、StringBuilder类、CharBuffer类、Charset类等。这些内容是Java进行文本处理的基石。...
- **用途**:包含与开发beans(基于JavaBeans架构的组件)有关的类。 - **关键类**:`BeanInfo`, `PropertyChangeListener` ##### 3.14 `java.lang` - **用途**:提供Java编程语言的基础类。 - **关键类**:`Object...