我从数据库接收一个字符串数组,其中包含控制字符作为分隔符。
使用的分隔符是(十六进制)01、02、03、04 和 05。当在 Java 中对相同的内容进行解码时,无论我使用哪种编码,01、02 和 03 都会解码
04 被解码为 156(Mac 上原生的 toCharArray)和 3F (ASCII),即 '?'
05 被解码为 09(Mac 和 ASCII 上原生的 toCharArray),即 '\t'
String test4 = "t035t735 ";
for(char d: test4.toCharArray())
{
int x = d;
System.out.print(x + " ");
}
System.out.println();
byte[] bytes = test4.getBytes("US-ASCII");
for(byte b : bytes)
{
System.out.print(b + " ");
}
我得到的返回是
116 48 3 51 53 156 116 55 3 51 53 156 9
116 48 3 51 53 63 116 55 3 51 53 63 9
对于相同的两个字符,在数据库中查询时的输出(十六进制)
。 .
0 0
4 5
对于这里可能发生的情况有什么意见吗?
最佳答案
(注意:“十六进制字符”不正确 - 这些将是“0”、“1”、...“9”、“A”、...“F”,因为它们用于表示十六进制数字。您应该说的是:“控制字符”。)
这些是来自数据库的该字符串(根据您的第一个输出行)中的真实字符代码(不是您显示的代码):
116 48 3 51 53 156 116 55 3 51 53 156 9
t 0 \u0003 3 5 \u009c t 7 \u0003 3 5 \u009c \u0009
\u0003 是控制字符 ETX(文本结束)。
\u009c 是(不可打印的)控制字符,称为字符串终止符
\u0009 确实是控制字符 TAB(制表)
如果您尝试使用 US-ASCII 对其进行解码,
116 48 3 51 53 63 116 55 3 51 53 63 9
? ?
字符串终止符被转换为“?”,这是非常清楚的,因为 US-ASCII 以字符\u007F = 127 结尾,并且超出此上限的所有内容(根据定义)都会转换为“?”。
所以我想你应该分割字符\u0003 和\u009c 和\u0009 (还有更多?)以获得中间的数据 block 。
String test4 = "t0\u000335\u009ct7\u000335\u0009";
for(char d: test4.toCharArray()) {
int x = d;
System.out.print(x + " ");
}
System.out.println();
String[] chunks = test4.split( "[\u0001-\u0005\u0009\u009c]" );
String del = "";
for( String s: chunks ){
System.out.print( del + "\"" +s + "\"" );
del = ", ";
}
System.out.println();
输出:
116 48 3 51 53 156 116 55 3 51 53 9
"t0", "35", "t7", "35"
关于java - 在 Java 中解码字符串内的控制字符与编码的内容不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445561/