Java和Go字符串编码分析

Java字符串编码

  • java String用的utf-16编码。一般是占用2个字节,有的不常见字符也会占用4个字节。所以java String内部用的char[]数组(jdk9以前)来存字符。
    一个char占用两个字节,而不常见的特殊字符,可能就需要两个char来存了,这时使用charAt等api就会出现问题。

Go字符串编码

  • Go string默认用UTF-8编码,我们用for range遍历字符串的时候,每个item是rune类型的。rune存的是unicode的码点,是uint32类型的,占4个字节,转为string时会自动按UTF-8编码。UTF-8是变长编码,1-4个字节都有可能,常见的中文一般是3个字节。
    如果用普通for循环遍历,然后用str[i]来获取到的是byte(uint8)类型的,占1个字节,记录的是ascaii码点值。超过ascaii码范围,可以通过str[i:]的方式来还原字符串,会自动用utf-8编码,但是如果i的起点不对,可能会乱码。
    所以用Go语言编程,剩去了很多转码的过程,要方便很多。

Java不用UTF-8的原因

  • Java不用UTF-8,是因为UTF-8是变长编码,如果采用UTF-8进行编码的话,类似于charAt、subString等API就不好实现了。虽然UTF-16也是变长的,但它大部分字符都可以用固定的两个字节进行编码,所以在java里可以认为它是定长编码。

Java9对String类型的改造

  • 在java9里String类型内部采用byte[]数组来实现,主要是为了效率考虑。因为实际使用中大部分字符串都是在ascall码范围内的,只需要用1个字节来编码,java9以前全部都采用2个字节编码,会浪费很多资源。
    String增加了一个变量coder,会自动判断用latin-1(1个字节)编码还是用utf-16编码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值