一些ASCII字符可以用Java中断/结束任何字符串/数组/流吗?

时间:2016-07-20 11:41:05

标签: java string char compression ascii

我正在开发一个小程序,通过替换重复的单词/短语来压缩文本,引用下一个出现 - 从而将字符串压缩为没有元数据或数组的较短字符串或在实际压缩中使用的任何技术。我的引用在某种意义上存储为字符对:

(char)7 + (char)(length << 4 + offset)

其中(char)7只是一个任意选择的char,用于表示压缩引用。长度和偏移量都是全范围byte变量,指的是将被替换的单词数和下一次出现之前的偏移量。 (我与这个问题无关,但我通过手动无符号&lt; - &gt;签名转换将它们视为无符号字节。)

//Example compression would result like this:
String input = "compression and compression";
String output = (char)7 + (char)18 + " and compression"
//(char)18 - binary 0001 0010 would be saying 1 word repeat, from 2 words ahead.

TL; DR:,我担心可能会有特殊情况可以将我的自定义字符解释为特殊的ASCII字符。我知道java中的字符串会忽略\0个字符(Due to this question)。但是有没有其他可能导致问题的java方法/类?假设我是否使用流,缓冲区,读取器,字符数组等发送/转换压缩字符串?

2 个答案:

答案 0 :(得分:1)

没有值具有“中断”或“结束”Java字符串,数组或流的任何特殊含义。

(至少,除非你设计了你的应用程序,或者使用/选择的协议或编码在特定的值上放置了这种性质的特殊含义。我不认为你做过......因为如果你已经完成了,你不会问这个问题。)

答案 1 :(得分:1)

String包含Unicode符号,称为代码点char包含2个字节,采用UTF-16格式,这是一种特殊格式。特别是有2个字符的代理对来表示2字节范围以上的代码点,高于2 16

除了使用char之外,你可以在代码点中完成所有操作,在java中类型为int。但是合法的Unicode有一个上限。

然而,只要您在某些编码中没有转换为字节,就可以摆脱编码。 是真正的问题。

由于没有干净的解决方案,byte[]ByteArrayOutputStreamByteBuffer(使用putShort等)可能更清晰。