我目前将字符串存储为字节数组。但是,当我尝试使用以下代码使用 Charset 将字节转换回字符串时,最后会出现菱形:
byte[] testbytes = "abc123".getBytes(); // tried getBytes("UTF-8"/StandardCharsets.UTF_8) too
Charset charset = Charset.forName("UTF-8"); // ISO-8859-1 has no diamonds
CharBuffer charBuffer = charset.decode( ByteBuffer.wrap( Arrays.copyOfRange(testbytes,0,testbytes.length) ) );
System.out.println("converted = " + String.valueOf(charBuffer.array()) );
// returns this - abc123����������
如果我将编码设置为 ISO-8859-1,它转换得很好。我认为这可能是源代码文件的编码,但在 Notepad++ 中打开它表明它也是 UTF-8。
我是否遗漏了什么,或者这只是 Android Studio 的 Logcat 窗口的问题?
- 编辑 1 -
进一步测试表明,3个字符的字符串结尾没有这个填充问题。如果您使用更长的字符串, Charset.decode 似乎会根据断点用 \u0000 值填充 char 数组。
String.valueOf 最终会将填充字符打印为菱形,同时创建一个新的 String 对象会删除填充,但是,由于敏感值,我根本不想使用 String 将字节数组转换为 char 数组。
- 编辑 2 -
如果您再次调用 charset.decode() 似乎会发生上述情况,所以我猜有一个缓冲区正在附加但不确定在什么时候。尝试使用 charBuffer.clear() 清除,但第二个代码块的输出似乎相同,即 3 个字符 + 2 个空格 + 6 个新字符。
String test1 = "123";
byte[] test1b = test1.getBytes();
char[] expected1 = test1.toCharArray();
CharBuffer charBuffer = charset.decode( ByteBuffer.wrap( test1b ) );
char[] actual1 = charBuffer.array(); // size 3, correct
String test2 = "123456";
byte[] test2b = test2.getBytes();
char[] expected2 = test2.toCharArray();
CharBuffer charBuffer2 = charset.decode( ByteBuffer.wrap( test2b ) );
char[] actual2 = charBuffer2.array(); // size 11, padded with '\u0000' 0