【问题标题】:Special chars in the java Stringjava字符串中的特殊字符
【发布时间】:2019-02-09 06:09:31
【问题描述】:

我正在寻找在 0xFE, 0xFF ( > 127) 这样的 java 字符串中插入特殊的 1 字节字符的解决方案。

我需要使用字符串而不是字节数组,因为类的方法只需要字符串类型。

String = {0x07 0xAA 0x03 FF} 我需要什么。是的,它是用于设备控制的特殊字符。

我尝试使用 String 构造函数:

byte[] arr = {0x07, (byte) 0xAA, 0x03, (byte) FF};
String s = new String(arr, "UTF-8"); 

//utf-8 用于1byte chars,我也试过ascII,但结果是一样的

All 可以在数组中 char 的值 127(dec) 之前工作,但是在它给出奇怪的结果之后,比如字符串中的 1 或 2 个额外字节,当然会发生,因为字节类型的最大值为 127。但是如何解决这种情况呢? ?需要帮忙。

我如何理解我不能将 char[] 添加到 String 构造函数中

【问题讨论】:

  • “我怎么理解我不能将 char[] 添加到 String 构造函数”你是什么意思?
  • String 似乎有一个constructor that takes a char array。这就是你要找的东西吗?
  • 使用 Unicode 转义:String s = "\u0007\u00AA\u0003\u00FF";
  • 是的,我的意思是我怎么知道 char 类型占用 2 个字节,对吧?因此,char 0xFF 将被添加到字符串中,例如 0x00 0xFF, .. 但我需要 1 个字节

标签: java arrays string char byte


【解决方案1】:

您的问题有一部分不正确。 UTF-8 仅将[32,126] 范围内的可打印 ASCII 字符存储为单个字节(除了每个字符 2 甚至 3 个字节之外),即使编码通常为 256 字节长。由于在 Java 中所有字符串默认自动存储和打印为 UTF-8,因此在打印时它们将保持超过 1 个字节。

您需要的是一种在访问字节时将所有[1,256] 前字节存储为单个字节的编码。例如,使用您当前的代码:

byte[] arr = {0x07, (byte) 0xAA, 0x03, (byte) 0xFF};
String s = new String(arr, "UTF-8");

System.out.println(s.getBytes().length); // This prints 8
System.out.println(s.getBytes("UTF-8").length); // This prints 8 as well (since the default is UTF-8)
System.out.println(s.getBytes("Windows-1252").length); // This prints 4

Try it online.

ISO-8859-1(也称为Code Page 1252 or Windows-1252)或Code page 437 是两种非常知名的编码。

【讨论】:

  • 好的,在您的帮助下,我找到了解决方案!问题是字符集!需要 ISO-8859-1
  • char[] arr = {0x07, 0xAA, 0x03, 0xFF}; spt.writeString(new String(arr), "ISO-8859-1");来自 portMonitor IRP_MJ_WRITE Serial0 SUCCESS 长度 4: 07 AA 03 FF
  • @Kost 很高兴我能帮上忙。 :)
猜你喜欢
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多