java使用nio写【中文与ascii字符(abc123)混合】时,出现不可见字符,其ascii码为0

Base64编码与字符编码:解决中文乱码的完整方案 字符编码是计算机处理文本的基础,它定义了字符与二进制字节之间的映射关系。在数据传输与存储过程中,不同编码方案(如UTF-8、GBK、GB2312)的混用常导致乱码问题。Base64编码作为一种二进制数据可打印化技术,本身不涉及字符编码,但实际应用中常与文本处理结合。当对字符串进行Base64编解码时,需先通过字符编码将其转换为字节序列,这一环节若编码不一致,就会引发乱码。本文聚焦于**GBK**、**GB2312**等中文编码环境,详解如何在Base64转换中显式指定并统一字符编码,确保中文文本在编解码过程 阅读详情

问题代码demo

public static void main(String[] args) {

        String text = "你好aa";
        final CharBuffer charStreamBuffer = CharBuffer.allocate(8192);

        BufferedReader bufferInput = new BufferedReader(new StringReader(text));
        try {
            int singleBatchSize;
            while ((singleBatchSize = bufferInput.read(charStreamBuffer)) != -1) {
                byte[] array = StandardCharsets.UTF_8.encode((CharBuffer) charStreamBuffer.flip()).array();
                charStreamBuffer.clear();
                System.out.println(Arrays.toString(array));
                System.out.println(singleBatchSize);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            charStreamBuffer.clear();
        }
    }

output:

[-28, -67, -96, -27, -91, -67, 97, 97, 0]
4

修正后代码demo

public static void main(String[] args) {
        String text = "你ac";
        final CharBuffer charStreamBuffer = CharBuffer.allocate(8192);

        BufferedReader bufferInput = new BufferedReader(new StringReader(text));
        try {
            int singleBatchSize;
            while ((singleBatchSize = bufferInput.read(charStreamBuffer)) != -1) {
                charStreamBuffer.flip();
                ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(charStreamBuffer);
                System.out.println(byteBuffer);
                System.out.println(byteBuffer.position());
                System.out.println(byteBuffer.limit());
                byte[] array = byteBuffer.array();

                charStreamBuffer.clear();
                System.out.println(Arrays.toString(array));
                System.out.println(singleBatchSize);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            charStreamBuffer.clear();
        }
    }

output:

java.nio.HeapByteBuffer[pos=0 lim=5 cap=7]
0
5
[-28, -67, -96, 97, 99]
3

其中关于 limit() 的介绍来自:https://www.cnblogs.com/atwanli/articles/7473795.html

Java与Python字符串处理实战:编码、清洗与安全过滤 字符串编码是计算机处理文本数据的基础,它定义了字符与字节之间的映射规则。理解编码原理(如UTF-8、GBK)是解决乱码问题的关键,其技术价值在于确保数据在存储、传输和显示过程中的一致性与完整性。在实际应用场景中,从用户输入、日志文件或第三方API获取的字符串常包含特殊字符、全角符号或不可见字符,若处理不当易引发数据错误或安全漏洞。本文以具体示例深入探讨了字符串规范化、安全过滤及生产环境编码问题排查,涵盖了**字符串清洗**与**编码问题**的实用解决方案,帮助开发者构建健壮的数据处理流程。 阅读详情

相关推荐

Base64编码与字符编码:解决中文乱码的工程实践

Base64编码是一种将二进制数据转换为ASCII字符的编码方案,其核心原理是将3个字节(24位)的数据重新划分为4组6位数据,每组映射到一个安全的ASCII字符。这项技术的核心价值在于确保二进制数据在仅支持文本的传输协议(如HTTP、JSON、XML)中能够安全、无损地传递,避免因特殊字符引发的解析错误。在实际应用中,尤其是在处理包含中文的文本时,乱码问题往往并非源于Base64算法本身,而是由于字符编码不一致所导致。字符编码定义了字符到字节序列的映射规则,常见的如UTF-8、GBK、GB2312等。当对

weixin_30764771的博客 409

SpringBoot添加过滤器Filter

面试必学,过滤器和拦截器

shun35的博客 1911

32位MD5算法原理与API签名实战:从哈希基础到跨语言实现

哈希算法是计算机科学中用于数据完整性校验和生成唯一标识的核心技术,其核心原理是将任意长度的输入通过特定计算映射为固定长度的输出。MD5作为一种经典的哈希函数,虽然因其碰撞漏洞在密码学安全领域不再推荐,但在非安全场景下,凭借其计算速度快、实现简单的特点,依然在API签名、数据校验等工程实践中广泛应用。理解MD5的工作原理,特别是其填充、分块、循环压缩的处理流程,是正确实现跨系统数据验证的基础。在API签名等场景中,MD5常被用作生成请求指纹,通过参数排序、密钥拼接和特定编码处理,确保通信的完整性和来源认证。本

weixin_34331102的博客 353

CharBuffer

CharBuffer public abstract class CharBuffer extends Buffer implements Comparable<CharBuffer>, Appendable, CharSequence, Readable { /** * 间接buffer,使用heap buffers备份数组 */ fi...

思睿-Sirui 3795

嵌入式开发必备:UART、RS232、RS485通信协议实战对比(附代码示例)

本文从嵌入式开发实战角度,深度对比了UART、RS232和RS485三种核心串行通信协议。详细解析了它们的工作原理、硬件连接、代码配置及典型应用场景,并提供了基于通信距离、节点数量和电磁环境的三维度选型指南,帮助开发者根据项目需求做出最优技术决策。

i0j1k2l3m的博客 474

【2025最新】Multisim 14.3超详细安装步骤 【附安装包+永久+汉化】|Multisim 14.3

嗨,小伙伴们!是不是一直在找可靠的multisim下载安装教程?今天就给大家带来超详细的2025年Multisim 14.3安装全攻略!这款电路仿真神器绝对是学电子、做电路设计的必备工具!很多朋友后台留言说安装时各种报错、汉化失败,所以我决定出一期零基础、保姆级的教程,从下载到安装再到汉化,全部一步到位搞定!按照我的步骤来,包你顺利安装不出错!!!通过本教程,相信大家已经成功安装并配置好了Multisim 14.3。这款电路仿真神器能帮你设计和测试各种电路,从简单的LED闪烁到复杂的信号处理电路都不在话下。

pythonpapaxia的博客 8万+

Java NIO中的缓冲区Buffer(二)创建/复制缓冲区

创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1、调用allocate方法 2、调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义; allocate方法创建缓冲区 调用allocate方法实际上会返回new HeapCharBuffer(capacity, capacity)对象; 缓存空间存储在CharBuffer类的成员属性char[] hb数组里,即J...

weixin_34226706的博客 371

《Python Web项目集锦》-专栏介绍和目录

本专栏专注于Python Web项目,涉及内容包含FastAPI、Django、Flask等,所有项目代码完整且可直接运行。不管是零基础还是有经验的开发,相信都能从本专栏获益。有任何问题欢迎私聊博主,专栏持续更新中...

数据知道的博客 5212

NIO知识一 Java NIO(New I/O)的三个属性position、limit、capacity

position: 下一次读取或写入的位置。 limit:指定还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)。 capacity:指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量。 以上三个属性值之间有一些相对大小的关系:0 现在我们可以从通道中读取一些数据

z781582206的博客 2987

YOLOv5算法改进(22)— 更换主干网络MobileNetv3 + 添加CA注意力机制

本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络MobileNetv3 + 添加CA注意力机制),小白必学~!🌈

小哥谈 2816

高云FPGA系列教程(7):ARM GPIO外部中断

高云GN1NSR-4C共有16个GPIO,每个GPIO可配置成输入或输出模式,支持中断输入,触发方式可选择:上升沿、下降沿、高电平、低电平触发。中断优先级可通过NVIC进行设置,支持 0-7 级可编程中断优先级。

whik1194的博客 1375

深入理解ASCII码与字符串转换:原理、实战与跨语言实现

字符编码是计算机科学的基础概念,它定义了字符与数字代码之间的映射关系。ASCII码作为最经典的字符编码标准,将128个英文字符、数字和控制符映射到0-127的数字,实现了文本在计算机中的标准化存储与传输。其技术价值在于为不同系统间的数据交换提供了通用语言,是网络通信、文件存储和硬件交互的基石。在实际工程中,开发者常需在人类可读的字符串与机器可处理的ASCII码序列之间进行双向转换,这一过程涉及编码(Encode)与解码(Decode)两个核心操作。例如,在网络协议解析或嵌入式系统通信时,需要将接收到的十六进

weixin_34345753的博客 314

2ED2410-EM的使用

2ED2410-EM的使用

让你爱上电路设计 972

Java基础面试高频考点:集合框架、JVM内存模型、多线程与锁(附常见场景题)

本文全面介绍了Java编程语言的核心概念、特性及应用场景。主要内容包括: Java基础特性:平台无关性(JVM机制)、面向对象特性(封装、继承、多态)、内存管理(垃圾回收)。 数据类型与转换:8种基本数据类型及其包装类,类型转换方式(自动/强制转换),BigDecimal的精度优势。 面向对象设计:抽象类与接口区别,多态实现方式,设计原则(SOLID),内部类分类及特点。 关键特性详解: 反射机制原理及应用(动态加载、框架实现) 注解原理及运行时处理 异常处理体系(Checked/Unchecked异常)

xwhxy的博客 1021

RK3568平台开发系列讲解(项目篇)手写数字识别

📢 本篇章带大家基于飞桨(PaddlePaddle),完成一个简单的手写数字识别任务。

内核笔记 1182

【嵌入式 – GD32开发实战指南(ARM版本)】第1部分 基础篇 - 第1章 开发环境搭建

开发环境: MDK:Keil 5.30 MCU:GD32F207IK 1.1 GD32F207I-EVAL开发板简介 笔者使用的开发板是兆易创新设计的GD32F207I-EVAL开发板。 GD32F207I-EVAL开发板使用 GD32F207IK作为主控制器,主频120MHz、集成3MB Flash、256KB SRAM、通用定时器*10、Adv. TM*2、Basic TM*2、系统时钟*1、看门狗*2、RTC*1、USART*4、UART*4、I2C*3、SPI*3、I2S*1、SDIO*1、CAN

不问归期的博客 9986

Java Scanner类深度解析:从控制台交互到文件解析的实战指南

在Java编程中,输入输出(I/O)处理是基础且关键的环节,它涉及数据从外部源到程序的流动与解析。其核心原理在于将底层的字节流或字符流进行封装和抽象,提供更便捷的读写接口。这项技术的价值在于简化了程序与用户、文件或网络的数据交互,是构建交互式应用、处理配置文件或日志分析等场景的基石。Scanner类正是Java标准库中实现这一思想的典型工具,它将输入源(如System.in、文件或字符串)封装成一个文本扫描器,通过定义分隔符将输入内容令牌化,从而允许开发者轻松读取整数、浮点数、字符串等多种数据类型。在控制台

weixin_30596165的博客 1338

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring Boot多语言文本处理:UTF-8编码与输入验证实战

字符编码是计算机处理文本数据的基础技术,它定义了字符与二进制数据的映射关系。UTF-8作为互联网标准编码方案,采用变长编码原理,能够兼容ASCII的同时支持全球多语言字符。在Web开发中,正确处理字符编码对于确保数据一致性和系统稳定性具有重要价值,特别是在处理中文、特殊符号和表情符号等复杂输入场景时。Spring Boot框架通过统一的编码配置、参数校验注解和全局异常处理机制,为多语言文本处理提供了完整的工程解决方案。本文基于实际项目需求,详细演示了如何构建支持UTF-8编码的REST API,涵盖字符编码

weixin_30932215的博客 323

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

(java)socket全双工长连接通信实例

(借鉴备忘)直接上代码: client: import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Reader; import java.net.Socket; import java.nio.CharBuffer; publ

飞行的码农 9417

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

DeepSeek总结的 SQLite 全连接比 union 慢得多

在SQLite中,FULL JOIN比UNION慢得多,因前者需生成笛卡尔积并逐行比较,而UNION仅合并并去重。尽管结果相同,但优化器未能识别简单场景下的等价性,导致性能差异显著(如案例中0.065秒 vs 12.85秒)。建议使用UNION实现“合并两列去重”逻辑,更高效且语义清晰。

l1t的专栏 171

DeepSeek辅助用表连接实现union all

一开始不用行号的版本统统错误,最后给出编行号的2个版本可以,版本1限制表内id不重复,版本2无此限制。除了a0和B0为模拟数据用到union all,其余不出现union all。

l1t的专栏 237

Ardunio ADC函数-16

较低的分辨率可使ADC读数更快,较高的分辨率可得到较为详细的电压读数。

智能机器人产学研基地 37

C# 15 类型系统补完:Union Types 与 Closed Hierarchies 让编译器替你数清分支

针对 switch 漏分支与跨程序集继承破坏封闭性的问题,给出 union 声明、closed 封闭层级与编译期穷尽校验的组合方案,附 AST 求值落地示例与排错清单。

2301_78967866的博客 386

Redis命令:ZUNION

Redis命令:ZUNION

闲余知道 371

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 276
上一篇: 记一次使用Future+ThreadPool的多线程卡死问题
下一篇: java进程开启jmx监控
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值