简单说说JAVA的String和byte[]的关系

Java byte[] 和 String互相转换 通过用例学习Java中的byte数组和String互相转换,这种转换可能在很多情况需要,比如IO操作,生成加密hash码等等。 除非觉得必要,否则不要将它们互相转换,他们分别代表了不同的数据,专门服务于不同的目的,通常String代表文本字符串,byte数组针对二进制数据 通过String类将String转换成byte[]或者byte[]转换成String 用String.getBytes()方法将字符串转换为byte数组,通过String构造函数将byte数组转换成String 注意:这种方式使用 阅读详情

做JAVA经常会碰到中文乱码问题,还有各种编码的问题,特别是String类的内容需要重新编码的问题。要解决这些问题,必须了解清楚JAVA对于字符串是怎么处理的。

    
    1,“字符”是由数字来表示的 先来重新了解一下计算机是如何处理“字符”的,这个原理是大家必须记住的,特别是在用JAVA写程序的时 候,万万不可模糊。我们知道,计算机把任何东西都用数字来表示,“字符”也不例外。比如我们要显示一个阿拉伯数字“3”,在我们的PC里,其实并不是仅仅 用一个数字3来代表我们要写的“3”,而是以十六进制的0x33来代表,包括放在内存或者是写到文件里,其实都是写着0x33的,不信你可以编辑一个文本 文件,写一个“3”,然后用ultraEdit看他的原始码。

    2,一切“字符”都必定用数字+编码表表示。
    这时候,有一个问题:为什么一定要用0x33来代表“3”呢?而不用0x43来代表呢?或者是直接用0x03来代替?其实用什么来代表都 可以,只不过大家都习惯了用ASCII编码表(是美国国家信息交换表)来确定各字符应该是用什么数字代表的。同样,为了表示中国字,我国也指定了中文的编 码表,其中最广泛使用的是GB2312。比如中文的“当”字,就是用0xB5, 0xB1这两个八位的数字来表示的。所以如果显示字符的程序不知道一列数 字到底是按什么编码表编码的,他也无法去判断到底这些是什么文字。如果随便用一个不对的编码表来处理这些数字,处理出来的字符很可能完全是错的。比如在英 文系统上,没有GB2312编码表,送给他一个0xB5,0xB1,他就傻傻的当作ASCII来处理(操作系统通常都有自己默认的编码表),结果显示出来 就是两个奇怪的符号,因为这两个字在ASCII表里就是那两个符号。同样在繁体中文系统里,他的编码表是BIG5,显示出来也是一个奇怪的中文,不是“当 ”字。

    3,UNICODE让全世界都说一种语言
    看完上面的文字,是否觉得,世界有那么多语言,每个都有自己的一套编码表,很麻烦呢?就算是中文,也有两套流行的编码表,一个是 GB2312,一个是BIG5。要使用不同中文的编码的字符时,还要转来转去,的确很麻烦。不光这个,如果想要写一篇包含很多过国文字的文章,就麻烦了, 必须要让处理这个文章的程序知道,哪个字是什么编码标准的。如果你想要在文章里找一个字,也必须指定你要找的是哪种编码的哪个字。否则,你要找一个 0xB5,0xB1的中文“当”字,很可能把同样数字表示的日文、波兰文这些不相干的字一起给你找出来,够麻烦的吧!
    所以人们想,不如大家都用同一个编码标准吧,各种文字都在编码表里有一席之地,处理文字的程序只需要都按这个编码表来处理就可以了。不 过要一个编码表里包含所有的文字,这张表就大了,本来英文字+数字一共只有128个以内。但加上中文后,忽然就多了数万个,所以存放一个字符需要的大小也 大了很多。现在UNICODE规定了一个字符必须由2个8位数字来表示,想想,8x8x8x8x = 65536 ,是多大的一个数字啊!所以全世界的文 字才能都包含进去。当然拉,也有人说中国字可能都不止6万个拉,还要包括别的文字,但人家外国人觉得你们中国人常用的也没那么多,所以就这么定了,我们也 没办法。需要注意的是GB2312和UNICODE虽然都是用两个8位数来代表一个中文字,但具体的规格可不一样,比如0xB5,0xB1在 UNICODE里面可不是“当”字,而是另外一国的文字来的。

    4,C是如何简洁的处理字符的
    我们来谈谈C的字符串。C语言诞生在JAVA之前,C语言的基本数据类型是没有字符串这个类型的,它只有char[]。也就是C把字符顺 序放入一个字节数组就完了。而且C也不管放在数组里的是什么文字,也不管那些字是按什么编码标准的。而且他的char的大小也不一定是8位数字,有时候是 16位也可能,这要看具体的机器和操作系统。所以写程序的人必须要知道正在处理的char[]的内容到底是按什么编码表表示的字符串,要知道如果比较两国 文字是否相同,可是没任何意义的哦!

    5,JAVA是是如何处理字符的。
    世界总会进步的,JAVA就是一个例子。JAVA终于有了String类了,它是解决字符问题的最好工具。在JAVA里,一个基本的要点 是:String类对象是不需要指定编码表的!为什么它会自己知道一堆数字各代表什么字符呢?就是因为String里的字符信息是用UNICODE编码存 放的。而JAVA为了表示字符(注意是单个字符),也有char这个数据类型,而且他的大小是固定2个8位16进制数字长度,也就是0~65535罗。为 的就是对应UNICODE里面的一个字符。大家如果想取一个String里的按UNICODE数字,可以用 getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 方法取得一个 char[],这个char[]里就是表示String字符的,按UNICODE编码表编码的数字。
    可惜现在绝大多数的系统和程序都不是按UNICODE来处理字符,而JAVA程序总是要和别的程序和系统交换数据的,所以在接收一个字 符,或者是发送一个字符的时候,就必须要留意当前系统和UNICODE的关系了。比如你从网络或者文件接受到一数字:0xB5,0xB1,JAVA程序并 不知道这两个字到底是中文呢?还是日文,或者英文。你如果不指明这个两个数字的编码表,JAVA就会按当前系统默认的编码表来处理。如果这两个数字是从中 文WIN98发出去的,JAVA程序又是在英文LINUX上运行的,那就出现了所谓的乱码问题了。也就是JAVA按英文的编码表ASCII来处理这两个数 字,当通过new String({0xB5,0xB1})得到的String的时候,这个String代表的已经不是中文的“当”字,而是两个英文的奇 怪字符了。不过如果你知道这两个数字一定是中文的话,就可以指定用new String({0xB5,0xB1},"GB2312")来处理,这时候新建 立的String才真的是一个“当”字。当然拉,如果你要把一个“当”字的JAVA的String显示在中文WIN98上,必须把这个字输出成两个8位数 字:0xB5,0xB1,不管是写成文件还是输出到浏览器上,都必须是0xB5,0xB1。如何把“当”字用GB2312输 出?String.getBytes("GB2312")就可以拉!所以有一点要记住:和外界交换任何信息都是以byte[]来进行的!。 你可以留意一下JAVA大多数的I/O类,都有以byte[]作为参数和返回值的方法。不过,也有很多写的比较糊涂的程序,没有提供byte[]交换信息 的方法,害的不同文字平台的程序员很头疼。Servlet的HttpRequest.getParameter()就是这样。好在有的 JSP/SERVLET容易还提供先指定编码表的方法,才能比较简单的解决这个问题。

    6,网上关于JAVA中文问题的一些错误处理方法。

    一个是最常见的,不管什么内容,都用new String(...,"ISO-8859-1")来建立字符串,然后使用的时候按默认的编 码格式(通常在服务器上都是英文系统)输出字符串。这样其实你使用的String并不是按UNICODE来代表真正的字符,而是强行把BYTE数组复制到 String的char[]里,一旦你的运行环境改变,你就被迫要修改一大堆的代码。而且也无法在同一个字符串里处理几种不同编码的文字。
    另一个是把一种编码格式的字符串,比如是GB2312,转换成另一种格式的字符串,比如UTF-8,然后不指明是UTF-8编码,而直 接用new String(...)来建立String,这样放在String里面的字符也是无法确定的,它在不同的系统上代表不同的字符。如果要求别人 用“UTF-8格式”的String来交换信息的时候,其实已经破坏了JAVA为了兼容各种语言所做的规定。这种错误的本质思想是还按写C语言的方式,把 字符串纯粹当作可以自己自由编码的存储器使用,而忽略了JAVA字符串只有一种编码格式。如果真的想自由编码,用byte[]或者char[]就完全了解 决问题的了。


    以上,除了是解决JAVA中文问题的基础知识外,也是多年前应该掌握的计算机基础知识。温故而知新,以期共勉

Lmcache+vllm——KVcache卸载CPU/SSD探索 目前查看了vllm、Nvidia dynamo、mooncake都没有找到将kvcache卸载到SSD的方法,幸好lmcache支持。以下进行lmcache+vllm实践,对比将kvcache分别卸载到CPU-ram和SSD上的TTFT性能差异。目前的query只是单并发,对比的效果已经比较明显了,可能多并发下对存储的要求就会更高了。 阅读详情

相关推荐

Multisim仿真入门:单相半波可控整流电路从搭建到波形分析(附避坑指南)

本文为电力电子技术初学者提供了一份详细的Multisim仿真指南,手把手教你从零搭建单相半波可控整流电路。通过对比纯电阻、阻感负载及加入续流二极管后的波形变化,直观理解晶闸管触发、电感续流等核心原理,并附有实用的参数设置与常见问题避坑指南,帮助你将抽象理论转化为可视化的工程实践。

weixin_29208077的博客 344

java byte[] 学习总结

最近在学习netty,突然发现自己对字符数组是那么的陌生(吓死宝宝了)。然后各种学习,然后测试,终于会用一些了。下线的都是本人的学习笔记。 byte表是字符,一个字节,8位,可以组成2^8=256中不同数字。byte存值范围: -128 - 127; -128 -> -1 在十六进制表示范围:0x80 -> 0xff ,在二进制表示范围:10000000 ->11...

XiChuan的博客 5万+

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7490

byte[]字节操作:byte[] 截取长度&byte[]数组转16进制&byte[]转数据类型工具类

一.字节定义 字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。Byte是从0-255的无符号类型,所以不能表示负数。 Byte即字节的意思,通常在读取非文本文件时(如图片,声音,可执行文件)需要用字节数组来保存文件的内容。在下载文件时,也是用byte数组作临时的缓冲器接收文件内容。所以说byte在文件操作时是必不可少的。不管是对文件写入还是读取都要用到。 先来了解一下数组的定义: byte [] aa = {0,1,2,3,4,5}; //字

panlupeng的博客 1万+

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!

通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性

GBupupup的博客 3791

时间序列预测 | 决策树时间序列预测建模,单步、多步(Python)

时间序列预测 | 决策树时间序列预测建模,单步、多步(Python)

天天酷科研的博客 745

Java中String, byte[], char[],StringBuffer, StringBuilder的区别联系与常见操作

文章目录byte和char的区别String、byte[]和char[]的联系String的构造函数byte[]转Stringchar[]转StringString转byte[]String转char[]String,StringBuilder,StringBuffer的区别与联系String转StringBuffer和StringBuilderStringBuffer转StringStringB...

JackComeOn的博客 2539

vue2 - elementUI表格table树形结构复选框勾选父子联动示例,el-table树状表格tree复选框checkbox多选框全选/反选取消children(当子级全选中,父级自动勾选)

vue2,elementui,el-table树状表格多选,树形结构结合多选框使用,实现单选父子联动全选反选,勾选联动父级勾选,表格多选check父子联动,table表格children如何嵌入复选框,el-table使用多选框与树形数据写一个有半选全选功能的表格,el-table树形表格实现复选框多选效果,表格树状结构多选,每一个row都可以选中并且联动全选按钮,table选父带子选子带父,树形数据与懒加载,Table表格树形结构多选框选中父级时会选中子级,elementUI表格里树形结构嵌套复选框全选全

✅ 精选推荐文章 1万+

深入了解String,StringBuffer和StringBuilder三个类的异同

Java提供了三个类,用于处理字符串,分别是String、StringBuffer和StringBuilder。其中StringBuilder是jdk1.5才引入的。 这三个类有什么区别呢?他们的使用场景分别是什么呢? 本文的代码是在jdk12上运行的,jdk12和jdk5,jdk8有很大的区别,特别是String、StringBuffer和StringBuilder的实现。 jdk5和jdk8中...

ting2909的博客 352

C# + NAudio:构建支持实时音频处理的语音聊天应用(含回声消除)

本文介绍了如何利用C#和NAudio库开发实时语音聊天应用,重点实现回声消除功能。首先概述了NAudio库在音频处理中的作用,包括音频录制、播放和实时处理能力。然后详细讲解了构建基础语音聊天应用的过程,包括麦克风录制和扬声器播放的实现。接着深入探讨了回声消除的原理和实现方法,提出通过比较麦克风输入和扬声器输出的音频信号来消除回声,并给出了核心代码示例。最后,文章还讨论了性能优化方向,如多线程处理和网络传输扩展。该方案为开发高质量实时语音应用提供了实用参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1013

SAP Fiori Launchpad 概述

SAP Fiori launchpad 是托管 SAP Fiori 应用程序的 shell,并为应用程序提供导航、个性化、嵌入式支持和应用程序配置等服务。SAP Fiori Launchpad 是移动和桌面设备上 SAP Fiori 应用程序的入口点。启动板显示带有图块的主页,其中可以显示实时状态指示器,例如打开的任务数量。每个图块代表用户可以启动的业务应用程序。这包括 SAP Business Suite 事务应用程序和 SAP Smart Business 分析应用程序。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 934

Java Socket 如何接收byte和String

Java Socket 如何接收byte和String 一、发送byte[]与String 我们平时是怎么发送byte和String的呢?举例代码: String str = "hello world"+ "\n"; byte[] bytes = 图片字节流; // 获取socket输出流 OutputStream out = socket.getOutputStream(); // 发送字符串 ...

Android唐浮的专栏 4879

Python + OpenCV 计算视频中运动最慢小球的坐标验证码

本文提出一种基于Python和OpenCV的视频分析方法,用于检测多个运动小球中最慢运动目标的坐标。方法主要包括:1) 通过背景差分和形态学处理提取运动前景;2) 基于轮廓面积和圆形度筛选候选小球;3) 利用图像矩计算小球质心坐标;4) 通过近邻关联构建运动轨迹;5) 根据轨迹平均速度确定最慢目标。该方法能有效处理包含线条干扰和静态大圆干扰的背景,稳定输出最慢小球的中心坐标。实验结果表明,该方法能准确识别运动最慢的小球并定位其位置。

码王吴彦祖的博客 116

JAVA中3种将byte转换为String的方法

JAVA中3种将byte转换为String的方法 HttpClient 类库中GetMethod类的getResponseBody方法返回的是byte[]类型,要操作起来不方便,我想把它转化成String类型。 查了网上的资料,有说法认为用这种方法比较好 BASE64Encoder enc=new BASE64Encoder(); String 转换后的string=enc

liuzheng2684的专栏 5万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java - byte[] 和 String互相转换

通过用例学习Java中的byte数组和String互相转换,这种转换可能在很多情况需要,比如IO操作,生成加密hash码等等。 除非觉得必要,否则不要将它们互相转换,他们分别代表了不同的数据,专门服务于不同的目的,通常String代表文本字符串,byte数组针对二进制数据 通过String类将String转换成byte[]或者byte[]转换成String 用String.getBytes(...

qq_33263769的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java byte[] 转 String的简单转换

简单的将byte[] 还原成了 String 值 [TOC] 代码: public class Test0719 { public static void main(String[] args) { String text = "test"; byte[] textBytes = text.getBytes();...

夜瑾漠的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 和 Go 中的 byte 和 String 转换

Java: 强调对字符集和编码的处理,String是用来表示文本的类,在转换时需要处理不合法的字节。Go string是不可变的字节序列视图,直接允许[]byte转换为string,无论字节是否构成有效的 UTF-8 字符。如果在 Java 中不希望进行替换错误编码的处理,而希望直接存储字节数据,应当选择直接使用byte[]而不是String。这样可以避免编码和解码过程中的问题。

Mint6的博客 1445

JAVA的String和byte[]的关系

    做JAVA经常会碰到中文乱码问题,还有各种编码的问题,特别是String类的内容需要重新编码的问题。要解决这些问题,必须了解清楚JAVA对于字符串是怎么处理的。          1,“字符”是由数字来表示的 先来重新了解一下计算机是如何处理“字符”的,这个原理是大家必须记住的,特别是在用JAVA写程序的时候,万万不可模糊。我们知道,计算机把任何东西都用数字来表示,“字符”也不例外。比如我

rockyd的专栏 2149

如何在Java中将Byte []数组转换为String

在Java中,我们可以使用new String(bytes, StandardCharsets.UTF_8)将byte []转换为String。 JavaSample.java package com.mkyong.io; import java.nio.charset.StandardCharsets; public class JavaSample { public sta...

一名可爱的技术搬运工 1万+

byte[]转换成String

通过用例学习Java中的byte数组和String互相转换,这种转换可能在很多情况需要,比如IO操作,生成加密hash码等等。除非觉得必要,否则不要将它们互相转换,他们分别代表了不同的数据,专门服务于不同的目的,通常String代表文本字符串,byte数组针对二进制数据通过String类将String转换成byte[]或者byte[]转换成String用String.getBytes()方法将字符...

yitian881112的专栏 10万+

String 和 byte 类型互换浅析

1. String 转换为 byte[] . String 类其实就是一个 char 数组 /** The value is used for character storage. */ private final char value[]; String 类自带方法getBytes(Charset charset) 将String 字符串转换文 byte 数组. ...

张伯毅的专栏 8960

java string(byte[])_java中string与byte[]的转换

1.string 转 byte[]byte[] midbytes=isoString.getBytes("UTF8");//为UTF8编码byte[] isoret = srt2.getBytes("ISO-8859-1");//为ISO-8859-1编码其中ISO-8859-1为单字节的编码2.byte[]转stringString isoString = new String(bytes,"I...

weixin_31813357的博客 2928
上一篇: grep命令介绍
下一篇: 最基础的也是最重要的
volcanodingning
博客等级 码龄19年 2粉丝 12原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值