Golang中的空字符,似花不是花

最近在Linux下开发Go程序,发现一个奇怪的问题,在读取Linux系统信息时读到了空字符,导致了程序异常。在 ASSIC中十六进制0为字符NUT,表示为 字符NULL。但这个字符在不同的编程语言、不同的运行环境中却有着不一样的呈现,如果换一个角度看,空字符也就是无字符也就能解释ASSIC空字符没有显示了。
在ASSIC中虽然十进制0-31、127为控制字符但各自的表现形式不一样,比较常用的字符:如换行\n、制表符\t等表现较为明显,空字符算较为特殊的。
似花不是花的只是一种错觉,似它不是它;
6461746100为ASSIC码的十六进制表示,字符为dataNUT,下面使用Go与Java分别在 Windows与Ubnuntu环境下看其表示形式。

Go

Golang中不同平台有着不一样的呈现效果,windows环境下可看得见,NUT空字符但在Linux环境下却是不可见的。
代码如下:

 buf,_:=hex.DecodeString("6461746100")
 s:=string(buf)
 fmt.Println(fmt.Sprintf("%v|长度:",s))

Ubuntu环境下IDEA的debug模式, 输出为:data|长度:5

Golang中的空字符,似花不是花

Windows环境下输出:

Golang中的空字符,似花不是花

字符处理

空字符不是空格,空字符的ASSIC十六进制为0,空格的十六进制为32,字符串中两者的处理也不相同;空格与空字符串是比较容易混淆的两个字符;
在字符串的处理:查找、替换、移除等操作中也比较容易把这两者混淆。

buf,_:=hex.DecodeString("6461746100")   s:=string(buf)
ss:=strings.Trim(s, "\000")                //移除空字符
st:=strings.TrimFunc(s, func(r rune) bool {  //移除空字符 
  return r==0
})
i:=strings.IndexRune(s,0)        //查找空字符索引
exist:=strings.Contains(s, "\x00")  //查找空字符

如上代码想要替换字符串中的空字符,必须使用字符或转义符进行;转义符有两种形式,八进制转义符与十六进制转义符,八进制转义符格式为:\DDD,十六进制转义符格式为:\xDD,DD为具体代表的ASSIC码数字,Unicode转义符:\uDDDD。

Java

原以为在Java中并不存在这种问题,比较符合直觉,空字符就是空字符,但实际上与Go一样在不同平台也有不一样的显示效果,好在Java在IDEA中还是能够看得到其字符串内部的字符信息,可以明显的看得到空字符的存在。
如下代码。

byte[] bytes=Hex.decodeHex("6461746100");
String n=new String(bytes);
System.out.println(String.format("%s|,长度:%s",n,n.length()));

Windows中现在还比较正常,符合人类认知,将byte数组转为字符串是可明显看到有一个空字符存在,在不管是在debug时还是程序打印输出,都输出了空字符串;

程序输出为:data |,长度:5

Golang中的空字符,似花不是花

在Linux环境下,此时n字符串已经看不到空字符了,虽然内部字符数组中依然看得到空字符的存在,但输出已经看不到空字符的存在。

程序输出:data|,长度:5

Golang中的空字符,似花不是花
文章首发地址:https://mp.weixin.qq.com/s/4H-yEBkhTe9KVChQaNiP5w

Original: https://www.cnblogs.com/softlin/p/14992755.html
Author: AiFly
Title: Golang中的空字符,似花不是花

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620173/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 编译项目的时候提示 是JRE不是JDK

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年5月30日
    075
  • IDEA 最实用快捷键【MAC版本】

    记录了MAC版本的IDEA 最实用快捷键,整理的大多数都是最常用的,值的一用,早日摆脱鼠标 command + del(自认为是键盘高手的必要技能) option + F7 Ctr…

    Java 2023年6月8日
    0102
  • 从IO到netty

    一、pageCache 1.FileOutputStream与BufferedOutputStream的主要区别 系统&#x8C…

    Java 2023年6月9日
    092
  • Java 将Excel转为UOS

    以.uos为后缀的文件,表示Uniform Office Spreadsheet文件,是一种国产的办公文件格式,该格式以统一办公格式(UOF)创建,使用XML和压缩保存电子表格。既…

    Java 2023年6月7日
    087
  • 8、BigInteger和BigDecimal类

    BigDecimal适合保存进度更高的浮点型(小数) 常见方法 add 加 subtract 减 multiply 乘 divide 除 //当我们编程中,需要处理很大的整数,lo…

    Java 2023年6月7日
    086
  • Java开发中关于资源路径获取问题

    描述 在开发中经常会读取配置文件,在Web开发中大多数都是在项目路径下。核心的API类或者是Controller异或是jsp页面等,基本都是基于web应用的相对路径,很少去操作绝对…

    Java 2023年6月5日
    078
  • 盘点飞思卡尔i.MX多媒体处理器前世今生 (转)

    现如今,移动处理器领域,大家关注最多的是德州仪器、高通、展讯、MTK,甚至包括Intel,但是请别忘记飞思卡尔,他的i.MX处理器已经发展到第六代。那么我们今天就来盘点下i.MX的…

    Java 2023年6月6日
    0107
  • mapstruct使用详解

    我们都知道,随着一个工程的越来越成熟,模块划分会越来越细,其中实体类一般存于 domain 之中,但 domain 工程最好不要被其他工程依赖,所以其他工程想获取实体类数据时就需要…

    Java 2023年6月5日
    089
  • [spring]spring中java实现类代替注解开发

    9.使用javaconfig实现代替xml配置 The central artifacts in Spring’s new Java-configuration sup…

    Java 2023年6月6日
    085
  • 线上elasticsearch unassigned shards 导致RED解决

    先通过命令查看节点的shard分配整体情况 curl -X GET "ip:9200/_cat/allocation?v" 说明:有16个索引未分片 2、查看未…

    Java 2023年6月6日
    0142
  • [Java编程思想] 第四章 控制执行流程

    4.1 true和false Java不允许将一个数字作为布尔值使用。 4.2 迭代 while、do-while和for控制着循环,有时将其划分为”迭代语句&#822…

    Java 2023年6月5日
    0103
  • MySQL 常见面试题/知识点总结!(2021 最新版)| JavaGuide

    相关阅读: 2.7w字!Java基础面试题/知识点总结!(2021 最新版) 这篇文章之前发过,不过,我最近对其进行了重构完善并且修复了很多小问题。所以,在公号再同步一下! 内容很…

    Java 2023年6月9日
    094
  • MySQL的Explain总结

    Explain简介 MySQL优化器在基于成本的计算和基于规则的SQL优化会生成一个所谓的 执行计划,我们就可以使用执行计划查看MySQL对该语句具体的执行方式。 介绍这个好啰嗦就…

    Java 2023年6月16日
    068
  • 第2课第7节_Java面向对象编程_内部类_P【学习笔记】

    摘要:韦东山android视频学习笔记 1、什么是内部类:在类的内部定义一个类,内部类可以访问类的私有属性 编译运行结果: 2、静态内部类可以不用先实例化类对象,在实例化内部类。需…

    Java 2023年5月29日
    062
  • 哈工大软件构造课程笔记

    软件构造总结笔记 本笔记依据考试大纲,调整课堂讲义的分点,以知识点分化作为条理,精简原本人课堂笔记,进行总结 何以牵尘 – 博客园 (cnblogs.com)https…

    Java 2023年6月9日
    070
  • 面试突击59:一个表中可以有多个自增列吗?

    自增列可使用 auto_increment 来实现,当一个列被标识为 auto_increment 之后,在添加时如果不给此列设置任何值,或给此列设置 NULL 值时,那么它会使用…

    Java 2023年5月29日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球