【问题标题】:Random escape sequences in javajava中的随机转义序列
【发布时间】:2020-11-19 10:49:03
【问题描述】:

我正在使用 java 中的转义字符(反斜杠 \)。当我得到 \n 或 \t 的长度(实际存储的字节数)时,我得到 1,当我得到 \n\t 的长度时,我得到 2,正如预期的那样。

当我打印时,我的困惑就开始了:

length of \123  -> 1
length of \177  -> 1
length of \178  -> 2
length of \190  -> 3

这是怎么回事?如果它与 ASCII 或扩展 ASCII 相关,那么这应该从 164 更改。另一个观察是在前三个字符之后它开始将每个字符计为 1 个长度,例如\123456 的长度为 4。

它与编码有关吗?我现在在我的 IDE 中设置了 UTF-8。

这可能是一个愚蠢的问题,但我不了解 unicode 或其编码的详细知识,有人可以解释一下吗?

【问题讨论】:

  • 你可以打印它们,你会看到 \123 在我的例子中打印 S,代码是 3 个密码,稍后你将创建一个 456 的字符串,所以 \123456 是 S456
  • 是的,我确实打印并观察到了相同的情况,但我想了解后台发生的情况。

标签: java string unicode character-encoding escaping


【解决方案1】:

当您使用 \ 和数字时,您使用的是八进制数 https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6 ,当将八进制 123 转换为十六进制时,它是 53 https://decimaltobinary.pro/Convert_octal_number_123_to_hexadecimal_ ,ASCII 中十六进制的 53 是 'S' https://ascii.cl/

因为我们是基于 8 的,所以我们可以使用 0 到 7 之间的数字:

  • 123,所有数字都可以当作八进制处理。

  • 177,所有数字都可以视为八进制。

  • 178, 1 和 7 小于 8 可以转换,8 在 base 8 之外。因此 8 被分解为一个字符。

  • 190, 1 可以是基数 8 的一部分,但 9 不能是 9 并且他之后的所有数字都被视为字符。

  • 123456 我们可以使用从 0 到 177 (7F) 的八进制 ASCII,因此 123 可以转换为一个字符。

【讨论】:

  • 感谢您的详细解释,接受并投票。
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多