我目前正在开发一个小程序,该程序通过用对下一个出现的引用替换重复的单词/短语来压缩文本 - 从而将字符串压缩为更短的字符串,没有元数据或数组或实际压缩中使用的任何技术。我的引用文献在某种意义上存储为字符对:
(char)7 + (char)(length << 4 + offset)
其中(char)7
只是一个任意选择的字符,用于表示压缩引用。 length 和 offset 都是全范围字节变量,指的是将被替换的字数以及直到下一次出现的偏移量。 (我与这个问题无关,但我通过手动无符号<->有符号转换将它们视为无符号字节。)
//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 方法/类可能会导致问题吗?假设我要使用流、缓冲区、读取器、字符数组等发送/转换压缩字符串?
最佳答案
String
保存 Unicode 符号,称为代码点,char
有 2 个字节,采用 UTF-16(一种特殊格式)。特别是有 2 个字符的代理对来表示 2 字节范围以上(即 216 以上)的代码点。
除了使用char
之外,您还可以在代码点中完成所有操作,在java中代码点的类型为int
。然而,合法的 Unicode 是有上限的。
但是,只要您不转换为某些编码中的字节,您就可以逃脱您的编码。 这才是真正的问题。
由于没有干净的解决方案,byte[]
、ByteArrayOutputStream
或 ByteBuffer
(使用 putShort 等)可能会更干净。
关于java - 一些 ASCII 字符可以中断/结束 Java 中的任何字符串/数组/流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38480325/