为了账号安全,请及时绑定邮箱和手机立即绑定

UTF-8 字符串转序数值:Python 输出的 Java 等效项

UTF-8 字符串转序数值:Python 输出的 Java 等效项

慕后森 2022-06-04 15:26:11
我觉得这很可能是重复的,但我找不到它。注意:我的 Python 知识非常有限,所以我不能 100% 确定 Python 中的字符串、字节和编码是如何完成的。我对一般编码的了解也不是太多..假设我们有字符串"Aä$$€h"。它包含三个不同的普通 ASCII 字符 ( A$h) 和两个非 ASCII 字符 ( ä€)。在 Python 中,我们有以下代码:# coding: utf-8input = u'Aä$$€h'print [ord(c) for c in input.encode('utf-8')]# Grouped per character:print [[ord(x) for x in c.encode('utf-8')] for c in input_code]这将输出:[65, 195, 164, 36, 36, 226, 130, 172, 104][[65], [195, 164], [36], [36], [226, 130, 172], [104]]现在我正在寻找一个 Java 等价物来提供这个相同的整数数组。我知道 Java 中的所有字符串默认情况下都使用 UTF-16 编码,并且只有字节数组可以具有实际编码。我认为下面的代码会给出我期望的结果:String input = "Aä$$€h";byte[] byteArray = input.getBytes(java.nio.charset.StandardCharsets.UTF_8);System.out.println(java.util.Arrays.toString(byteArray));但不幸的是,它给出了以下结果:[65, -61, -92, 36, 36, -30, -126, -84, 104]我不确定这些负值来自哪里..所以我的问题主要是这样的:给定 Java 中包含非 ASCII 字符(即"Aä$$€h")的字符串,输出其序号 UTF-8 整数,类似于 Pythonord函数对 UTF-8 编码字节所做的操作。这个问题的第一部分,因为我们已经有一个 Java 字符串,是这个问题的先决条件。
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

Javabyte已签名,这就是负数的来源。按位计算,两种语言中的数字具有相同的值,它们的表示方式不同。您可以使用以下方法获得与 python 中相同的表示Byte.toUnsignedInt():


String input = "Aä$$€h";

byte[] byteArray = input.getBytes(java.nio.charset.StandardCharsets.UTF_8);

int[] ints = new int[byteArray.length];

for(int i = 0; i < ints.length; i++) {

    ints[i] = Byte.toUnsignedInt(byteArray[i]);

}

System.out.println(java.util.Arrays.toString(ints));

哪个打印:


[65, 195, 164, 36, 36, 226, 130, 172, 104]


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号