项目出了问题,因为AscII非打印字符的原因,后来找了一下啊ASCII的非打印字符,总共有31个,然后我们直接全部替换成问号了.

解决方式为先找到非打印字符,这是我从网上找的非打印字符表:

进制 十六进制 字符   十进制 十六进制 字符
0 00   16 10 数据链路转意
1 01 头标开始   17 11 设备控制 1
2 02 正文开始   18 12 设备控制 2
3 03 正文结束   19 13 设备控制 3
4 04 传输结束   20 14 设备控制 4
5 05 查询   21 15 反确认
6 06 确认   22 16 同步空闲
7 07 震铃   23 17 传输块结束
8 08 backspace   24 18 取消
9 09 水平制表符   25 19 媒体结束
10 0A 换行/新行   26 1A 替换
11 0B 竖直制表符   27 1B 转意
12 0C 换页/新页   28 1C 文件分隔符
13 0D 回车   29 1D 组分隔符
14 0E 移出   30 1E 记录分隔符
15 0F 移入   31 1F 单元分隔符

当碰到这样的打印字符的时候,替换成问号?

程序为:

博客地址:http://blog.csdn.net/dlxuemin/article/details/1576975

知道了他们的ascII码之后,可以将原先在字符串中的非打印字符用问号?过滤

函数为

// yyy.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <malloc.h>
#define MAX_MESSAGE_LENGTH 1000
char matchStr1[]="111,aaa,ddd";
static char * NoPrinttoQuestionMark(char *src)
{
char *p = src;
char dest[MAX_MESSAGE_LENGTH + 1024];
memset(dest,0,sizeof(dest));
char *q = dest;
int dst_len = sizeof (dest);
while(0 != *p && dst_len > 2)
{
if(*p >0x1F)
{
*q++ = *p++;
} else {
*q++ = '?';
p++;
}
dst_len--;
}
*q = 0;
return dest;
} int main(int argc, char* argv[])
{ char * abc="333 333 aaa aaa ddd 444 aaa 666";
printf("--原先--\n%s,size=%d\n",abc,strlen(abc)); abc=NoPrinttoQuestionMark(abc);
printf("--替换完之后--\n%s,size=%d\n",abc,strlen(abc));
return 0;
}

当然 看到这段代码之后我们发现两个问题

(1):while(0 != *p && dst_len > 1)

在这个循环体中,有一个

if(*p >0x1F) 假如我们希望,将制表符,回车,换行,单元分割符过滤掉的话,应当改成:

   if(*p >=0x1F|| *p == 0x0a||*p==0x0D||*p==0x09)
(2) dst_len > 2 的原因是说 C 语言规定最后一个字符一定是'\0' 最后一个不用替换的,倒数第二个假如替换的话,要++,这样就超出了限制,直接不替换了.

 

ASCII 打印字符表

十进制 十六进制 字符   十进制 十六进制 字符
32 20 space   80 50 P
33 21 !   81 51 Q
34 22 "   82 52 R
35 23 #   83 53 S
36 24 $   84 54 T
37 25 %   85 55 U
38 26 &   86 56 V
39 27 '   87 57 w
40 28 (   88 58 X
41 29 )   89 59 Y
42 2A *   90 5A Z
43 2B +   91 5B [
44 2C ,   92 5C /
45 2D -   93 5D ]
46 2E .   94 5E ^
47 2F /   95 5F _
48 30 0   96 60 `
49 31 1   97 61 a
50 32 2   98 62 b
51 33 3   99 63 c
52 34 4   100 64 d
53 35 5   101 65 e
54 36 6   102 66 f
55 37 7   103 67 g
56 38 8   104 68 h
57 39 9   105 69 i
58 3A :   106 6A j
59 3B ;   107 6B k
60 3C <   108 6C l
61 3D =   109 6D m
62 3E >   110 6E n
63 3F ?   111 6F o
64 40 @   112 70 p
65 41 A   113 71 q
66 42 B   114 72 r
67 43 C   115 73 s
68 44 D   116 74 t
69 45 E   117 75 u
70 46 F   118 76 v
71 47 G   119 77 w
72 48 H   120 78 x
73 49 I   121 79 y
74 4A J   122 7A z
75 4B K   123 7B {
76 4C L   124 7C |
77 4D M   125 7D }
78 4E N   126 7E ~
79 4F O   127 7F DEL
												

ASCII 非打印字符的更多相关文章

  1. ASCII 可打印字符与控制字符

    2017-08-16 21:29:30 基本的 ASCII 字符集共有 128 个字符,其中有 95 个可打印字符,包括常用的字母.数字.标点符号等,另外还有 33 个控制字符.标准 ASCII 码使 ...

  2. ascii码所有字符对照表(包含汉字和外国文字)

    http://www.0xaa55.com/thread-398-1-1.html看到了0xaa55的这个帖子,想起了2年前我在51cto发的一个帖子http://down.51cto.com/dat ...

  3. 微信公众号API返回不可打印字符的处理。

    引言 在使用微信公众号的"批量获取用户基本信息"API时,发现在某些时候不能使用php的json_decode转为数组,打印出curl获取到的内容中,发现了几个不可打印字符.相信不 ...

  4. Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法

    Base64编码是从二进制到字符的过程. Base64编码主要用在传输.存储.表示二进制等领域,还可以用来加密,但是这种加密比较简单. byte[] byteArray = Encoding.UTF8 ...

  5. strings - 显示文件中的可打印字符

    总览 (SYNOPSIS) strings [-a|-|--all] [-f|--print-file-name] [-o] [--help] [-v|--version] [-n min-len|- ...

  6. 为什么乱码:<meta http-equiv="content-type">前的非ANSI字符

    为什么乱码:<meta http-equiv="content-type">前的非ANSI字符 浏览器检测网页字符集的默认顺序 浏览器的网页字符集检测顺序通常是: ch ...

  7. Linux c字符串中不可打印字符转换成16进制

    本文由 www.169it.com 搜集整理 如果一个C字符串中同时包含可打印和不可打印的字符,如果想将这个字符串写入文件,同时方便打开文件查看或者在控制台中打印出来不会出现乱码,那么可以将字符串中的 ...

  8. Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

    Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a n ...

  9. 注册许可证出现“输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非空白字符”

    问题描述: 引入失败!输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符.两个以上的填充字符,或者填充字符间包含非空白字符 解决方案: 去注册cloud7.0的产品,重新引入 ...

随机推荐

  1. Sublime Text 2 安装emmet插件和常用快捷键

    一.先安装package control1.按Ctrl+`调出console,输入以下命令然后回车 import urllib2,os; pf='Package Control.sublime-pac ...

  2. IDEA之google style配置(IDEA)

    一.window下IDEA配置谷歌编码规范xml 1.首先下载文件:intellij-java-google-style.xml(文件详细内容见附件) 2.找到该路径(C:\Users\自己的登录名 ...

  3. POJ2104 —— K-th number

    1.题目大意:区间第k小,什么修改没有... 2.分析:这个是可持久化线段树,也是主席树,解释一下,n个线段树是怎么存下的,就是每一颗线段树和前一个有logn个点不一样 然后我们只需要一个线段树开lo ...

  4. JNI_Android项目中调用.so动态库实现详解

    转自:http://www.yxkfw.com/?p=7223 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj. ...

  5. git 教程(6)--管理修改

    现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行,这就是一个修改 ...

  6. 添加Mysql到Windows系统服务

    下载了免安装版的MySQL后,将压缩包加压.到这一步mysql还不能工作,我们还需要做一些工作: 1.     安装mysql服务 新建一个批处理文件StartMysql.bat,文件内容如下: @E ...

  7. NOI2005 聪聪和可可

    Sol 记忆化搜索. \(f[u][v]\) 表示聪聪在 \(u\) ,可可在 \(v\) ,聪聪抓到可可的期望. 预处理出 \(u\) 到 \(v\) 最短路径编号最小的点,记为 \(g[u][v] ...

  8. Maven 实用命令和技巧

    1.Jar冲突排查 maven dependency:tree 人工排除

  9. <a href=”#”>与 <a href=”javascript:void(0)” 的区别

    <a href=”#”>中的“#”其实是锚点的意思,默认为#top,所以当页面比较长的时候,使用这种方式会让页面刷新到页首(页面的最上部) javascript:void(0)其实是一个死 ...

  10. Java中时间日期格式化

    1.与日期时间相关的类:      第一:java.util.Date;                           将时间作为一个整体使用.处理时,使用Date类较为简便      第二:j ...