夏雨落 2024-04-16 20:49 采纳率: 96.2%
浏览 2
已结题

java字符类型和字符串,如何表示中文汉字?

我们可以使用两个甚至多个字节来表示一个中文字符,这样我们能够表示的数量就大大增加了,GB2132方案规定当连续出现两个大于127的字节时(注意不考虑符号位,此时相当于是第一个bit位一直为1了),表示这是一个中文字符(所以为什么常常有人说一个英文字符占一字节,一个中文字符占两个字节),这样我们就可以表示出超过7000种字符了,不仅仅是中文,甚至中文标点、数学符号等,都可以被正确的表示出来。
不过这样能够表示的内容还是不太够,除了那些常见的汉字之外,还有很多的生僻字,比如龘、錕、釿、拷这类的汉字,后来干脆直接只要第一个字节大于127,就表示这是一个汉字的开始,无论下一个字节是什么内容(甚至原来的128个字符也被编到新的表中),这就是Windows至今一直在使用的默认GBK编码格式。
虽然这种编码方式能够很好的解决中文无法表示的问题,但是由于全球还有很多很多的国家以及很多很多种语言,所以我们的最终目标是能够创造一种可以表示全球所有字符的编码方式,整个世界都使用同一种编码格式,这样就可以同时表示全球的语言了。所以这时就出现了一个叫做ISO的(国际标准化组织)组织,来定义一套编码方案来解决所有国家的编码问题,这个新的编码方案就叫做Unicode(准确的说应该是规定的字符集,包含了几乎全世界所有语言的字符),规定每个字符必须使用两个字节,即用16个bit位来表示所有的字符(也就是说原来的那128个字符也要强行用两位来表示)
但是这样的话实际上是很浪费资源的,因为这样很多字符都不会用到两字节来保存,肯定不能直接就这样去表示,这会导致某些字符浪费了很多空间,我们需要一个更加好用的具体的字符编码方式。所以最后就有了UTF-8编码格式(它是Unicode字符集的一个编码规则),区分每个字符的开始是根据字符的高位字节来区分的,比如用一个字节表示的字符,第一个字节高位以“0”开头;用两个字节表示的字符,第一个字节的高位为以“110”开头,后面一个字节以“10开头”;用三个字节表示的字符,第一个字节以“1110”开头,后面俩字节以“10”开头;用四个字节表示的字符,第一个字节以“11110”开头,后面的三个字节以“10”开头:

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 20:50
    关注

    引自免费微信小程序:皆我百晓生

    在Java中,处理中文字符主要涉及以下几个概念:字节、字符、字符串,以及不同的字符编码格式,如ASCII、GB2312、GBK、Unicode和UTF-8。

    1. 字节(Byte) 字节是最小的存储单位,通常用来表示二进制数据。在计算机中,一个字节由8位(bits)组成,可以表示从0到255之间的整数。

    2. 字符(Character) 在Java中,字符是一个基本数据类型,用char关键字表示。每个字符占用16位(2字节),可以表示Unicode字符集中的一部分字符。Unicode字符集包含世界上大部分的文字和符号。

    3. 字符串(String) 字符串是由字符组成的序列,在Java中,字符串是对象,使用String类来表示。字符串中的每个字符都是一个char类型的值。

    4. 字符编码格式 为了将字符转换成字节以便于存储和传输,需要使用字符编码格式。不同的编码格式对应不同的字符映射关系。

    • ASCII: 只能表示128个字符,包括英文字母、数字、标点符号等,不支持中文。
    • GB2312/GBK: 用于中文字符的编码,GBK是在GB2312基础上扩展的,可以表示约2万个汉字和一些特殊符号。
    • Unicode: 包含世界上几乎所有的字符,但使用固定的2字节表示每个字符。
    • UTF-8: 是Unicode的一种实现,使用可变长度的字节序列表示字符,对于ASCII字符使用1字节,其他字符使用2-4字节。

    在Java中,处理中文字符的基本步骤如下:

    创建字符串:

    // 使用Unicode转义序列创建包含中文的字符串
    String chineseString = "你好,世界!";
    

    读取和写入文件:

    import java.io.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            String chineseString = "你好,世界!";
    
            // 写入文件
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("chinese.txt"), "UTF-8"));
            writer.write(chineseString);
            writer.close();
    
            // 读取文件
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("chinese.txt"), "UTF-8"));
            String content = reader.readLine();
            reader.close();
    
            System.out.println(content);  // 输出:你好,世界!
        }
    }
    

    转换编码格式:

    import java.nio.charset.Charset;
    
    public class Main {
        public static void main(String[] args) {
            String original = "你好,世界!";
            String converted;
    
            // 将UTF-8转换为GBK
            try {
                byte[] utf8Bytes = original.getBytes("UTF-8");
                converted = new String(utf8Bytes, "GBK");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
    
            System.out.println(converted);
        }
    }
    

    总结: 在Java中,要正确地表示和处理中文字符,你需要确保使用正确的字符编码格式,例如UTF-8,并且在读写文件或在网络通信中保持编码的一致性。使用String类可以直接操作字符,而不需要关心底层的字节表示。如果你需要处理特定的编码格式,可以使用Charset类的getBytes()new String(byte[], charset)方法进行转换。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 创建了问题 4月16日

悬赏问题

  • ¥15 在不同的执行界面调用同一个页面
  • ¥20 基于51单片机的数字频率计
  • ¥50 M3T长焦相机如何标定以及正射影像拼接问题
  • ¥15 keepalived的虚拟VIP地址 ping -s 发包测试,只能通过1472字节以下的数据包(相关搜索:静态路由)
  • ¥20 关于#stm32#的问题:STM32串口发送问题,偶校验(even),发送5A 41 FB 20.烧录程序后发现串口助手读到的是5A 41 7B A0
  • ¥15 C++map释放不掉
  • ¥15 Mabatis查询数据
  • ¥15 想知道lingo目标函数中求和公式上标是变量情况如何求解
  • ¥15 关于E22-400T22S的LORA模块的通信问题
  • ¥15 求用二阶有源低通滤波将3khz方波转为正弦波的电路