首页 » 网站推广 » stringgetbytesphp技巧_从 StringgetBytes 理解 Java 编码和解码

stringgetbytesphp技巧_从 StringgetBytes 理解 Java 编码和解码

访客 2024-11-05 0

扫一扫用手机浏览

文章目录 [+]

由于原码,补码,反码比较大略,我这里粘贴一个例子进行展示。

Unicode 和 UTF-8 的关系

stringgetbytesphp技巧_从 StringgetBytes 理解 Java 编码和解码

Uincode 是一个字符集。
它规定了我们利用到的字或符号的码点(code point)。
码点利用 16 进制保存。

stringgetbytesphp技巧_从 StringgetBytes 理解 Java 编码和解码
(图片来自网络侵删)

Uincode 字符集规定 一 的码点为 4E00。

Uincode 字符集规定 丁 的码点为 4E01。

打算机呢只能识别二进制的 0 和 1。
而 UTF-8 指的是编码规则,规定码点怎么保存成二进制。

还有别的 Unicode 编码规则,UTF-16 和 UTF-32。

上述表格大略描述了Unicode 按 UTF-8 编码的格式。

首先将 16 进制的码点,通过进制转换 为十进制然后利用十进制的数字查找上述表格处于哪个范围中,得出编码规则。
然后将码点转换为 2 进制,从低位到高位更换 x 即可得到字二进制的原码将二进制的原码转换为补码存储。

java 内存中的字符串采取的是 unicode 编码,也便是内编码。
我们可以从 unicode 转变为 GBK 或 UTF-8 等其它规则。

代码验证猜想

以赵为例子讲解。

赵的码点为:8D75

16 进制的码点转换为 10 进制:36213

36213 处于 2048-65535 ,得出对应的 UTF-8 编码格式为:1110xxxx 10xxxxxx 10xxxxxx

赵的 16 进制码点 8D75 转换为二进制 1000

将二进制添补在 1110xxxx 10xxxxxx 10xxxxxx 中的 x 中,不敷的补 0.

11101000 10110101 10110101。

对三个字节分别求补码为:

原码:11101000 10110101 10110101

补码:10011000 11001011 11001011

补码对应 java 中的字节数组为:{-24,-75,-75}

@Testpublic void run454() throws UnsupportedEncodingException { String str =\公众赵\"大众; final byte[] bytes = str.getBytes(\"大众UTF-8\"大众); StringBuilder stringBuilder =new StringBuilder(); for (byte aByte : bytes) { stringBuilder.append(aByte).append(\"大众,\公众); } System.out.println(stringBuilder.toString());}再加一个例子:

且的码点:4E14

16 进制的码点转换为 10 进制:19988

19988 处于 2048-65535 ,得出对应的 UTF-8 编码格式为:1110xxxx 10xxxxxx 10xxxxxx

16 进制的码点转换成二进制:100111000010100

原码:11100100 10111000 10010100

补码:10011100 11001000 11101100

补码对应的字节数组为:{-28,-72,-108}

@Testpublic void run43() throws UnsupportedEncodingException { // {-28,-72,-108} String str =\"大众且\公众; final byte[] bytes = str.getBytes(\公众UTF-8\"大众); StringBuilder stringBuilder =new StringBuilder(); for (byte aByte : bytes) { stringBuilder.append(aByte).append(\公众,\"大众); } System.out.println(stringBuilder.toString());}

GBK 转码

赵的 GBK 码点为:D5D4 十六进制码点转换为二进制:11010101 11010100 源码:11010101 11010100 补码:10101011 10101100

补码对应的字节数组为:{-43,-44}

@Testpublic void run454() throws UnsupportedEncodingException { String str =\公众赵\公众; final byte[] bytes = str.getBytes(\公众GBK\"大众); StringBuilder stringBuilder =new StringBuilder(); for (byte aByte : bytes) { stringBuilder.append(aByte).append(\公众,\"大众); } // -43,-44 System.out.println(stringBuilder.toString());}

JAVA 中乱码问题

java 字符或字符串采取 uincode 作为内编码。

@Testpublic void run44() { String str=\公众\u0c2c\"大众;// బ System.out.println(str);// ✈ System.out.println(\公众\u2708\"大众);}

编码:字符串到字节。

解码:字节到字符串。

当我们读取文件的时候实际读取的是字节。
然后根据文件的编码格式,将字节解码成字符串。
乱码问题随意马虎涌现的地方便是这里。

不要企图将一个乱码的字符串变成一个非乱码的。
这个思路是缺点的。
该当从乱码之前的字节动手处理。

@Testpublic void run100() throws UnsupportedEncodingException { String str = \"大众张\"大众; final byte[] gbks = str.getBytes(\"大众GBK\"大众); final String s = new String(gbks, \"大众UTF-8\公众); System.out.println(s);}

上述例子中的 s 已经乱码了,当你操作这个 s 获取字节也是乱码的。

因此思路是操作 gbks 转换解码办法获取字符串。

末了,我自己是一名从事了多年开拓的JAVA老程序员,今年年初我花了一个月整理了一份最适宜2019年学习的java学习干货,可以送给每一位喜好java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:[互换]即可免费获取。

作者:张攀钦

来源:掘金

标签:

相关文章

Python编程从入门到精通,探索编程之美

编程已经成为现代社会的一项基本技能。Python作为一种简单易学、功能强大的编程语言,在我国教育领域备受关注。本文将从Python...

网站推广 2025-03-02 阅读1 评论0

Scum07代码编程之美与适用方法

编程已成为当今社会不可或缺的技能之一。Scum07代码作为一款经典的编程语言,在我国众多程序员中备受推崇。本文将深入解析Scum0...

网站推广 2025-03-02 阅读1 评论0

Linux环境下的前端代码运行优化与步骤

前端技术逐渐成为软件开发的核心。Linux操作系统因其稳定性、安全性、开放性等特点,成为众多开发者和企业青睐的运行环境。本文将从L...

网站推广 2025-03-02 阅读1 评论0