首页 > 编程语言 >编程语言与字符编码

编程语言与字符编码

时间:2024-06-20 10:22:23浏览次数:28  
标签:编码 UTF 字节 编程语言 字符 length getBytes String

聊聊在编程语言中的字符,例如 Java

一个字符占多少个字节?

得看情况,不同编码下情况不同。这里引用 肖国栋 大佬的知乎回答:

具体地讲,脱离具体的编码谈某个字符占几个字节是没有意义的。

就好比有一个抽象的整数“42”,你说它占几个字节?这得具体看你是用 byte,short,int,还是 long 来存它。用 byte 存就占一字节,用 short 存就占两字节,int 通常是四字节,long 通常八字节。当然,如果你用 byte,受限于它有限的位数,有些数它是存不了的,比如 256 就无法放在一个 byte 里了。字符是同样的道理,如果你想谈“占几个字节”,就要先把编码说清楚。

同一个字符在不同的编码下可能占不同的字节。

就以你举的“字”字为例,“字”在 GBK 编码下占 2 字节,在 UTF-16 编码下也占 2 字节,在 UTF-8 编码下占 3 字节,在 UTF-32 编码下占 4 字节。

不同的字符在同一个编码下也可能占不同的字节。

“字”在 UTF-8 编码下占 3 字节,而“A”在 UTF-8 编码下占 1 字节。(因为 UTF-8 是变长编码)

Java 中的字符串

对于 String 类型,有这样一个方法:getBytes()​,其将一个字符串转化为 Byte 序列,并存储到新的 byte[]​ 数组:

String str2 = "abcdefg";
byte[] b = str2.getBytes();
for(int i = 0; i < b.length; i++){
  System.out.println(b[i]); //输出97.98.99.100...103, 就是 abcdefg 的 ASCII 码
}

问个面试题:new String("字").getBytes().length ​的值是多少?还是上面提到的那句话,得看编码。

在 UTF8 下,"字"​ 占 3 个; 而在 GBK 下,一个汉字占 2 个字节;如果 getBytes()​ 没有传参,那么默认使用操作系统编码,通常,Windows 系统下是 GBK,Linux 和 Mac 是 UTF-8:

String str = "严";
System.out.println("str.getBytes().length: "+ str.getBytes().length);
System.out.println("str.getBytes(\"GBK\").length: "+ str.getBytes("GBK").length);
System.out.println("str.getBytes(\"UTF-8\").length: "+ str.getBytes("UTF-8").length);

编译和运行结果:

str.getBytes().length: 2
str.getBytes("GBK").length: 2
str.getBytes("UTF-8").length: 3

注意事项:

  1. 可以在启动 JVM 时设置一个默认编码,例如:java -Dfile.encoding=GBK Main​。不过如果你在代码里还是显示的指定了编码,还是以指定编码为准;
  2. 如果你用 IDE 来运行代码,并且设置了工程的默认编码是 UTF-8,那么此时运行程序的时候会加上 -Dfile.encoding=UTF-8​ 参数。
  3. 由于受启动参数及所在操作系统环境的影响,不带参数的 getBytes​ 方法通常是不建议使用的,最好是显式地指定参数以此获得稳定的预期行为。

char 类型

Java 语言规范规定,Java 的 char 类型是 UTF-16 的 code unit,也就是一定是 16 位(2 字节):

官方文档char​, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1).

值得一提的是,在 Java 设计之初,UTF-16 还是定长编码的,但是随着 Unicode 字符的增多,UTF-16 就改为变长编码了(2 个字节或 4 个字节)。 所以 char 中只能放 UTF-16 编码下只占 2 字节的那些字符,如果一个字符在 UTF-16 编码下占 4 字节,显然它是不能放到 char 中的。

Python 下的字符编码

Python2 默认用的编码是 ASCII,Python3 默认用的是 UTF8

分别使用 len("你好") 在 Python3 得到的结果是 2,在 Python2 得到的结果是 6(6 个字节)

Java 中的 String.length()

在 Java 中,可以通过 String.length()​ 计算字符串的长度。那么这个长度是什么呢?我们来看看 length() ​的注释和源码:

/**
 * Returns the length of this string.
 * The length is equal to the number of Unicode code units in the string.
 *
 * @return  the length of the sequence of characters represented by this object.
 */
public int length() {
    return value.length;
}

注释里说,会返回字符串中 Unicode unit 的数量。在 Java 中,使用的是 UTF-16,因此这个方法的功能可以解释为:返回字符串的长度,这一长度等于字符串中的 UTF-16 的代码单元的数目。

也就是说,如果一个字符使用 4 个字节,那么 String.length() ​长度是 2!

我们来测试下:

public class TestStringLength {
  public static void main(String[] args) {
    String str = "A";
    System.out.println(str.length());

    String str2 = "

标签:编码,UTF,字节,编程语言,字符,length,getBytes,String
From: https://www.cnblogs.com/PeterJXL/p/18258158

相关文章

  • 编码在网络安全中的应用和原理
    什么是编码,为什么要有编码?众所周知,计算机只能够理解0和1,也就是二进制。可是我们的世界0和1以外,还有太多太多的符号和语言了,这时候,我们通过人为的规定一种0和1的排列组合顺序为某一种符号或者语言,这就是编码。是一种人为的规定的一种映射集合。想要了解网络安全,学习网络安全知......
  • #C:比如有如下两个字符串:“hello“、“helhehe“不能使用库函数完成字符串的比较
    #include<stdio.h>#include<string.h>voidtest00()//比如有如下两个字符串:"hello"、"helhehe"不能使用库函数完成字符串的比较{ //时刻需要注意变量i的值  charbuf1[128]="";   printf("请输入第一个字符串buf1:");   //scanf("%s",buf1);......
  • #c:键盘输入一个字符串判断它是不是回文 回文:123321
    小小案例仅供参考:/键盘输入一个字符串判断它是不是回文比如:12321这个就是回文#include<stdio.h>#include<string.h>voidtest01(){  charbuf[128]="";  printf("请输入一个字符串:\n");  fgets(buf,sizeof(buf),stdin);  buf[strlen(buf)-1]=0; ......
  • Day 25:1807. 替换字符串中的括号内容
    Leetcode1807.替换字符串中的括号内容给你一个字符串s,它包含一些括号对,每个括号中包含一个非空的键。比方说,字符串“(name)is(age)yearsold”中,有两个括号对,分别包含键“name”和“age”。你知道许多键对应的值,这些关系由二维字符串数组knowledge表示,其......
  • Kotlin 编程语言详解:特点、应用领域及语法教程
    什么是Kotlin?Kotlin是一种现代、流行的编程语言,由JetBrains在2016年发布。自发布以来,它已经变得非常流行,因为它与Java兼容(Java是目前最流行的编程语言之一),这意味着Java代码(和库)可以在Kotlin程序中使用。Kotlin用于:移动应用程序(特别是Android应用程序)Web开......
  • Java设置JSON字符串参数编码
    1.如何在Java中创建JSON字符串在Java中创建JSON字符串,我们可以使用多个库,其中最流行的是Jackson、Gson和org.json。以下是使用这些库创建JSON字符串的示例:1.1使用Jackson库(1)首先,确保我们的项目中包含了Jackson的依赖(如果我们使用Maven,可以参考前面的示例)。(2)创建一个Java对象(例......
  • 汇编语言程序设计 - 统计字符串中非数字字符的数
    80x86汇编习题题目描述:从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。思路:有两种思路,一种是先输出,后计数;另一种是边输入,边计数。本文是用前者。1,逐个字符输入到BUFF,指针后移,判断是否为'$',是则结束输入2,逐个判断数组内容是否为数字,是则......
  • HTML特殊字符:对钩与叉号
    表示“对钩”的特殊转义符号汇总:特殊符号编码描述✓&#10003;CHECKMARK手写体对钩(细)✔&#10004;HEAVYCHECKMARK手写体对钩(粗)√&radic;平方根、常用于表示对钩符号☑&#9745;BALLOTBOXWITHCHECK方框对钩✅&#9989;WHITEHEAVYCHECKMAR......
  • 【信息学奥赛】CSP-J/S初赛03 计算机网络与编程语言分类
    第1节计算机网络基础1.1网络的定义所谓计算机网络,就是利用通信线路和设备,把分布在不同地理位置上的多台计算机连接起来。计算机网络是现代通信技术与计算机技术相结合的产物。网络中计算机与计算机之间的通信依靠协议进行。协议是计算机收、发数据的规则。TCP/IP:用于......
  • MySQL的字符集与排序规则
    在MySQL数据库中,字符集(CharacterSet)和排序规则(Collation)是两个至关重要的概念,它们共同决定了数据库中字符数据的存储、比较和排序方式。对于涉及多语言、国际化或特殊字符处理的应用来说,正确选择和使用字符集与排序规则尤为关键。一、字符集(CharacterSet)字符集定义了数据库......