java - 在 Java 中解码字符串内的控制字符与编码的内容不同

标签 java hex

我从数据库接收一个字符串数组,其中包含控制字符作为分隔符。

使用的分隔符是(十六进制)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/

相关文章:

java - 如何消除对 Java 枚举值的依赖?

objective-c - 将 NSString 转换为十六进制

c# - 将 10 位数字转换为十六进制字符串

java - Wicket 口 1.5 与 1.4 相比

java - 为什么 if 语句中的表达式顺序很重要

java - Hibernate 给出了一个奇怪的 ClassCast 异常(使用 Transformers)

api - 网站如何加密 API 响应?

java - 显示用户输入的第一个字母

linux - 用 ASCII 空格替换字符串中的 HEX 字符 (\x20)

用于RGBA到HEX颜色转换的R函数