Java:字符串的字符值(以字节为单位)是常量吗?

Java:字符串的字符值(以字节为单位)是常量吗?,java,character-encoding,char,byte,Java,Character Encoding,Char,Byte,TL;DR:在Java中,将通过charAt方法从字符串中获得的字符转换为字节是否总是产生相同的值? 我正在读取的文件是用我们不知道的任意字符编码编码的。我需要解析这些文件并查找某些单词,例如TAG。我对文件内容设置了某些限制,例如在查找标记时,标记的字节必须与其ASCII表示形式相同。 例如,假设我有以下文件: 0x00 0x11 0x22 0x33 0x54 0x41 0x47 0x77 0x88 0x99 0xaa 0xbb 由于T、A和G的ASCII值分别为0x54、0x41和0x47,

TL;DR:在Java中,将通过charAt方法从字符串中获得的字符转换为字节是否总是产生相同的值? 我正在读取的文件是用我们不知道的任意字符编码编码的。我需要解析这些文件并查找某些单词,例如TAG。我对文件内容设置了某些限制,例如在查找标记时,标记的字节必须与其ASCII表示形式相同。 例如,假设我有以下文件: 0x00 0x11 0x22 0x33 0x54 0x41 0x47 0x77 0x88 0x99 0xaa 0xbb 由于T、A和G的ASCII值分别为0x54、0x41和0x47,因此我可以通过解析字节本身在文件中找到标记。 0x00 0x11 0x22 0x330x54 0x41 0x470x77 0x88 0x99 0xaa 0xbb 但是,我需要硬编码我要查找的字节的值。为此,我调用String的charAtint I方法并将字符转换为一个字节。 例如,我将如何验证一个名为b的任意字节作为“T”的字节表示: 字符串标签=标签; chart=tag.charAt0; 如果bytet==b{ //这里有魔术,比如比较“A”和“G” } 注意:代码实际上不是这样的,验证算法更加优雅。 这在我的本地机器上运行良好。然而,这将在可能包含非常奇怪编码的机器上运行。让我担心的是,根据机器的不同,将charAt获得的字符转换为字节是否会产生不同的值。我知道Java总是使用UTF-16字符编码对字符进行编码,但我担心从字符串到字符再到字节的转换可能会产生奇怪的结果。 那么,简而言之,将通过charAt方法从字符串中获得的字符强制转换为字节是否总是产生相同的值?还是取决于外部因素? 谢谢你的帮助!
注意:我不能硬编码字节本身,例如,字节数组,因为它们可能非常长,将来可能会经常更改。

将字符转换为带字节的字节将在所有系统上得到相同的结果


然而,很少需要混合使用字符和字节。你真的应该用其中一个。正如您所怀疑的那样,混淆这些概念可能会导致混淆。

将字符转换为字节,再转换为字节,将在所有系统上得到相同的结果

然而,很少需要混合使用字符和字节。你真的应该用其中一个。混用这些概念可能会导致混淆。

Yes charAt int返回一个Java定义的字符类型UTF-16,因此总是相同的字节类型

相反,String.getBytes根据指定的字符集或操作系统的默认字符集(如果未指定)返回字节。

Yes charAt int返回Java定义的字符类型UTF-16,因此始终是相同的字节类型


相反,String.getBytes根据指定的字符集或操作系统的默认字符集(如果未指定任何字符集)返回字节。

java.lang.String.charAt将始终返回一个16位UTF-16字符,当您将其转换为字节时,该字符将始终相同,尽管因为char是一个16位无符号数据类型,将其转换为8位有符号字节可能会导致不必要的行为。但是,如果源数据是ASCII,您将获得与预期完全相同的行为类型。

您可以使用Character.codePointAtchar c方法,而不是直接键入它们。这应该保证每次都有相同的结果。

您可以使用Character.codepointcar c方法,而不是直接键入它们。这应该可以保证每次都得到相同的结果。

字符串的字符将始终返回一个16位UTF-16字符,当您将其转换为一个字节时,该字符将始终相同。如果您不知道编码,如何将文件读入字符串?@RogerLindsjö我没有将文件读入字符串。就像我说的,我正在直接读取以字节为单位的文件。我使用硬编码字符串来知道在该文件中可以找到什么。字符串的字符将始终返回一个16位UTF-16字符,当您将其转换为一个字节时,该字符将始终相同。如果您不知道编码,如何将文件读入字符串?@RogerLindsjö我不是将文件读入字符串。就像我说的,我正在直接读取以字节为单位的文件。我使用硬编码字符串来知道在该文件中可以找到什么。