linux内核解析xml,XML 解析中,如何排除控制字符

今天在解析一个中文的 XML时,始终报错 PCDATA invalid Char value 21 in Entity ,查询了一下这个 21 的ascii 值,

发现是:

| 0001 0101 | 21 | 15 | NAK | ␕ | 确认失败回应 |

怎么会有这样奇怪的字符,我也搞不清楚。google 一下这个错误,发现很多网站都报这样的错误,就是没有一篇文章

说明为什么出错了。折腾了半天,后来又看了Libxml的源代码,发现下面的字符要在字符串里面排除掉:

| [二进制](http://www.cnblogs.com/zh-cn/%E4%BA%8C%E8%BF%9B%E5%88%B6 "二进制") | [十进制](http://www.cnblogs.com/zh-cn/%E5%8D%81%E8%BF%9B%E5%88%B6 "十进制") | [十六进制](http://www.cnblogs.com/zh-cn/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6 "十六进制") | 缩写 | 可以显示的表示法 | 名称/意义 |

| 0000 0000 | 0 | 00 | NUL | ␀ | 空字符(Null) |

| 0000 0001 | 1 | 01 | SOH | ␁ | 标题开始 |

| 0000 0010 | 2 | 02 | STX | ␂ | 本文开始 |

| 0000 0011 | 3 | 03 | ETX | ␃ | 本文结束 |

| 0000 0100 | 4 | 04 | EOT | ␄ | 传输结束 |

| 0000 0101 | 5 | 05 | ENQ | ␅ | 请求 |

| 0000 0110 | 6 | 06 | ACK | ␆ | 确认回应 |

| 0000 0111 | 7 | 07 | BEL | ␇ | 响铃 |

| 0000 1000 | 8 | 08 | BS | ␈ | 退格 |

|   |   |   |   |   |   |

|   |   |   |   |   |   |

| 0000 1011 | 11 | 0B | VT | ␋ | 垂直定位符号 |

| 0000 1100 | 12 | 0C | FF | ␌ | [换页键](http://www.cnblogs.com/w/index.php?title=%E6%8D%A2%E9%A1%B5%E9%94%AE&action=edit&redlink=1 "换页键(尚未撰写)") |

|   |   |   |   |   |   |

| 0000 1110 | 14 | 0E | SO | ␎ | 取消变换(Shift out) |

| 0000 1111 | 15 | 0F | SI | ␏ | 启用变换(Shift in) |

| 0001 0000 | 16 | 10 | DLE | ␐ | 跳出数据通讯 |

| 0001 0001 | 17 | 11 | DC1 | ␑ | 设备控制一(XON 启用软件速度控制) |

| 0001 0010 | 18 | 12 | DC2 | ␒ | 设备控制二 |

| 0001 0011 | 19 | 13 | DC3 | ␓ | 设备控制三(XOFF 停用软件速度控制) |

| 0001 0100 | 20 | 14 | DC4 | ␔ | 设备控制四 |

| 0001 0101 | 21 | 15 | NAK | ␕ | 确认失败回应 |

| 0001 0110 | 22 | 16 | SYN | ␖ | 同步用暂停 |

| 0001 0111 | 23 | 17 | ETB | ␗ | 区块传输结束 |

| 0001 1000 | 24 | 18 | CAN | ␘ | 取消 |

| 0001 1001 | 25 | 19 | EM | ␙ | 连接介质中断 |

| 0001 1010 | 26 | 1A | SUB | ␚ | 替换 |

| 0001 1011 | 27 | 1B | ESC | ␛ | 跳出 |

| 0001 1100 | 28 | 1C | FS | ␜ | 文件分割符 |

| 0001 1101 | 29 | 1D | GS | ␝ | 组群分隔符 |

| 0001 1110 | 30 | 1E | RS | ␞ | 记录分隔符 |

| 0001 1111 | 31 | 1F | US | ␟ | 单元分隔符 |

| 0111 1111 | 127 | 7F | DEL | ␡ | 删除 |

大多数都在 31 以前的几个字符,注意,还有个字符 127 要去掉。去掉的方法我是用正则,用下面的正则就可以

去掉了:

```

[//x00-//x08//x0b-//x0c//0e-//1f//7f]。

$val = preg_replace("/[//x00-//x08//x0b-//x0c//0e-//1f//7f]/", '', $val);

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核,每个进程都有自己的内核堆栈,用于保存当前进程的执行状态、寄存器、局部变量等信息。当内核执行系统调用、断处理、异常处理等操作时,会使用内核堆栈来保存相关信息。 以下是Linux内核堆栈解析方法: 1. 确定内核堆栈地址:在Linux内核堆栈通常位于进程控制块(PCB)内核栈指针(kernel stack pointer)所指向的地址。可以通过查看进程的PCB结构体的kernel_stack成员来获取内核堆栈地址。 2. 获取堆栈帧指针:堆栈帧指针(frame pointer)是指向当前堆栈帧底部的指针,用于确定当前堆栈帧的大小和位置。可以通过读取当前CPU寄存器ebp(x86架构)或者r29(ARM架构)的值来获取堆栈帧指针。 3. 解析堆栈帧:在堆栈帧,局部变量、函数参数、返回值等信息都保存在栈。可以通过指针运算和类型转换等方法来访问这些信息。需要注意的是,由于内核堆栈是内核态的栈,因此在解析过程需要特别小心,防止出现悬垂指针、越界访问等问题。 4. 调试工具:除了手动解析堆栈外,还可以使用调试工具来辅助解析。例如,可以使用gdb调试器的bt命令来打印当前进程的堆栈回溯信息,或者使用系统调用ptrace来跟踪进程的堆栈信息。 总之,在Linux内核解析堆栈需要一定的经验和技能,需要特别小心,以避免出现问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值