字符显示问题

bytyblc 2006-08-15 08:50:28
比如用十六进制表示的字符'\xDB'为什么在dos环境显示不出呢,我用的是vc6.0,请教下各位大虾,这是什么原因呢?有什么解决的办法吗?
...全文
115 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-08-15
  • 打赏
  • 举报
回复
刚好手头有一篇, 贴上来楼主看看:

字符编码
多年来美国人一直使用ASCII对字符编码,可以方便地交换英语文本。但不幸的是,ASCII完全不足以处理大多数其它语言的字符集。多年来不同的国家采用不同的技术交换不同语言的文本。最近,ISO推出了ISO 10646,用于表示世界上所有字符的单一31比特编码方案,被称为通用字符集(UCS)。可用16比特(UCS的前65536个字符)表示的字符被称为“基本多语言平台”(BMP),而且BMP意图覆盖所有口头语言。Unicode论坛推出了Unicode标准,注重于16比特字符集,并为了有助于互操作性增加了一些附加的约定。

尽管如此,大多数软件不是为处理16比特或32比特字符设计的,所以开发出一种叫做“UTF-8”的特殊格式来编码这些潜在的国际字符,现有的程序和库更容易处理这种格式。在IETF RFC 2279和其它一些地方有UTF-8的定义,所以它是一种可以自由阅读和使用的定义完好的标准。UTF-8是可变长度编码;从0到0x7f (127)的字符作为单个字节被编码为自身,更大值的字符则被编码为2到6个字节信息(依赖于具体值)。编码被特别设计以具有以下良好特性(取自RFC和Linux中utf-8的man帮助页):


标准的US ASCII字符(0--0x7f)编码为自身,这样只包含7比特ASCII字符的文件和字符串在ASCII和UTF-8编码下是相同的。这对于许多已有美国程序和数据文件的反向兼容性而言是太好了。

所有大于0x7f的UCS字符被编码为仅由0x80到0xfd范围内的字节组成的多字节序列。这就意味着ASCII字节不会变成另一个字符的一部分。许多其它的编码方法允许嵌入NIL的字符,会导致程序失效。

在UTF-8和2字节或4字节固定长度的字符表示(分别被称为UCS-2和UCS-4)之间进行转换很容易。

UCS-4字符串保持了按字典分类的顺序,可以直接对UTF-8数据应用Boyer-Moore快速查找算法。

所有可能的2^31个UCS代码都可以用UTF-8进行编码。

表示单个非ASCII的UCS字符的多字节序列的第一个字节总是在0xc0到0xfd范围内,表示该多字节序列有多长。多字节序列的所有其它字节都在0x80到0xbf范围内。这就可以很容易地实行重新同步;如果丢失了某个字节,可以很容易地跳到“下一个”字符,而且总是可以很容易地跳到“前一个”或“后一个”字符。


简而言之,UTF-8转换格式正在成为交换国际文本信息的主要方法,因为它可以支持世界上的所有语言,而且还与美国的ASCII文件反向兼容,并具有其它一些良好特性。出于诸多理由,我推荐使用这种编码,特别是在把数据保存到“文本”文件时。

提及UTF-8的原因在于某些字节序列不是合法的UTF-8,而且可能成为可利用的安全漏洞。RFC提到了以下内容:

UTF-8的实现者需要考虑如何处理非法的UTF-8序列的安全方面的问题。可以想象,在某些情况下黑客可以通过发送一个UTF-8语法不允许的八进制序列,来利用一个不谨慎的UTF-8解释器。

对于执行对UTF-8编码形式的输入进行关乎安全的合法性检查的解释器,可以采用一个方式特别微妙的攻击,使得特定的非法八进制序列被解释为字符。例如,某个解释器可能禁止编码为单个八进制序列00的NUL字符,但允许非法的两个八进制序列C0 80,把它解释为一个NUL字符。另一个例子就是可能会有个解释器禁止八进制序列2F 2E 2E 2F(“/../”),但允许非法的八进制序列2F C0 AE 2E 2F。


有关此问题的较为充分的讨论可以在 http://www.cl.cam.ac.uk/~mgk25/unicode.html 上的Markus Kuhn的 UTF-8 and Unicode FAQ for Unix/Linux 里看到。

UTF-8字符集是可以列出所有非法值(并证明已经全部列出)的一种情况。如果要确定是否得到一个合法的UTF-8序列,需要检查两件事:(1)初始序列是否合法,(2)如果合法,是否第一个字节后面跟随了所要求的合法后续字符数目?进行第一项检查很简单,可以证明下面是所有非法UTF-8初始序列的完全列表:




Table 4-1. 非法UTF-8初始序列

UTF-8序列 非法的原因
10xxxxxx 作为字符的起始字节非法(80..BF)
1100000x 非法,过长(C0 80..BF)
11100000 100xxxxx 非法,过长(E0 80..9F)
11110000 1000xxxx 非法,过长(F0 80..8F)
11111000 10000xxx 非法,过长(F8 80..87)
11111100 100000xx 非法,过长(FC 80..83)
1111111x 非法;为规格说明所禁止




需要说明的是在某些情况下,可能会要松散地打断(或内部使用)十六进制序列C0 80。这是个可以代表ASCII NUL(NIL)的过长序列。由于C/C++在把NIL字符包含在普通字符串里会出问题,有些人在想要把NIL作为数据流的一部分时就使用该序列;Java甚至把这种方法奉为经典。在处理数据时可以自由地在内部使用C0 80,但从技术角度来说,在保存数据时应该把它转换回00。根据实际需要,可以自行决定是否“马虎”一下,把C0 80作为UTF-8数据流的输入。

第二个步骤是检查正确的后续字符数目是否包含在字符串中。如果第一个字节的头两个比特被置位了,那么数一下头一个比特位后被置位比特的个数,然后再检查是否有那么多以比特“10”开头的后续字节。因此,二进制数11100001就要求两个以上的后续字节。

与此有关的一个问题是在ISO 10646/Unicode中某些语句可以用多种方式表示。例如,有些带着重号的字符可以用单个字符(带着重号)表示,也可以用一组字符(如基本字符加上单独排版的着重号)来表示。这两种形式可能看起来完全一样。也可以在其中插入一个零宽度的空格,使看起来相似的二者有所区别。有些情况下要小心这样的隐藏文本会干扰程序。
jixingzhong 2006-08-15
  • 打赏
  • 举报
回复
楼主你可以看看 字符编码,
包括 ascii、扩展 ascii、 unicode, utf8 ...

然后你就会明白一些了 ...
jixingzhong 2006-08-15
  • 打赏
  • 举报
回复
ascii 只有 128 个字符 ...

而且其中还有一些是 不可显示的字符 ...
阿发伯 2006-08-15
  • 打赏
  • 举报
回复
补充,即使你使用双字节字符的操作系统,如汉字操作系统,0xDB属于半个字,也是不能正确显示的,不是乱码就是空白或者产生某些控制作用,如回车换行等。
阿发伯 2006-08-15
  • 打赏
  • 举报
回复
在DOS的文本方式下,只能显示0x20 - 0x7F以内的字符,大于这个范围属于扩展的ASCII码,一般用来显示双字节码,如汉字,但必须汉字系统支持,否则显示为乱码;小于这个范围则为控制码,属于非显示码。你的\xDB经过0x7f与操作后,可能小于或等于0x20,因此显示不出来了。
包含以下内容: 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 009 乘法口诀表 010 猜数字游戏 011 模拟ATM(自动柜员机)界面 012 用一维数组统计学生成绩 013 用二维数组实现矩阵转置 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较整数大小 023 指向数组的指针 024 寻找指定元素的指针 025 寻找相同元素的指针 026 阿拉伯数字转换为罗马数字 027 字符替换 028 从键盘读入实数 029 字符行排版 030 字符排列 031 判断字符串是否回文 032 通讯录的输入输出 033 扑克牌的结构表示 034 用“结构”统计学生成绩 035 报数游戏 036 模拟社会关系 037 统计文件的字符数 038 同时显示两个文件的内容 039 简单的文本编辑器 040 文件的字数统计程序 041 学生成绩管理程序 第二部分 数据结构篇 042 插入排序 043 希尔排序 044 冒泡排序 045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置 057 运动会分数统计 058 双链表 059 约瑟夫环 060 记录个人资料 061 二叉树遍利 062 浮点数转换为字符串 063 汉诺塔问题 064 哈夫曼编码 065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值计算与趣味数学篇 075 绘制余弦曲线和直线的迭加 076 计算高次方数的尾数 077 打鱼还是晒网 078 怎样存钱以获取最大利息 079 阿姆斯特朗数 080 亲密数 081 自守数 082 具有abcd=(ab+cd)2性质的数 083 验证歌德巴赫猜想 084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 奇数平方的有趣性质 096 角谷猜想 097 四方定理 098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 109 复平面作图 110 绘制彩色抛物线 111 绘制正态分布曲线 112 求解非线性方程 113 实矩阵乘法运算 114 求解线性方程 115 n阶方阵求逆 116 复矩阵乘法 117 求定积分 118 求满足特异条件的数列 119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 128 金刚石图案 129 飘带图案 130 圆环图案 131 肾形图案 132 心脏形图案 133 渔网图案 134 沙丘图案 135 设置图形方式下的文本类型 136 绘制正多边形 137 正六边形螺旋图案 138 正方形螺旋拼块图案 139 图形法绘制圆 140 递归法绘制三角形图案 141 图形法绘制椭圆 142 抛物样条曲线 143 Mandelbrot分形图案 144 绘制布朗运动曲线 145 艺术清屏 146 矩形区域的颜色填充 147 VGA256色模式编程 148 绘制蓝天图案 149 屏幕检测程序 150 运动的小车动画 151 动态显示位图 152 利用图形页实现动画 153 图形时钟 154 音乐动画 第五部分 系统篇 155 读取DOS系统中的国家信息 156 修改环境变量 157 显示系统文件表 158 显示目录内容 159 读取磁盘文件 160 删除目录树 161 定义文本模式 162 设计立体窗口 163 彩色弹出菜单 164 读取CMOS信息 165 获取BIOS设备列表 166 锁住硬盘 167 备份/恢复硬盘分区表 168 设计口令程序 169 程序自我保护 第六部分 常见试题解答篇 170 水果拼盘 171 小孩吃梨 172 删除字符串中的特定字符 173 求解符号方程 174 计算标准差 175 求取符合特定要求的素数 176 统计符合特定条件的数 177 字符串倒置 178 部分排序 179 产品销售记录处理 180 特定要求的字符编码 181 求解三角方程 182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除指定的字符 195 括号匹配 196 字符串逆置 197 SIX/NINE问题 198 单词个数统计 199 方差运算 200 级数运算 201 输出素数 202 素数题 203 序列排序 204 整数各位数字排序 205 字符串字母移位 206 Fibonacc数列 第七部分 游戏篇 207 商人过河游戏 208 吃数游戏 209 解救人质游戏 210 打字训练游戏 211 双人竞走游戏 212 迷宫探险游戏 213 迷你撞球游戏 214 模拟扫雷游戏 215 推箱子游戏 216 五子棋游戏 第八部分 综合实例篇 217 综合CAD系统 218 功能强大的文本编辑器 219 图书管理系统 220 进销存管理系统
用于windows下面的vim编辑器。 给喜欢vim的人使用。详细如下: 好吧,详细点,这里写出一些基本的命令: 【什么是vi】 vi就是linux命令行下的最著名的编辑器之一,(编辑器就是类似windows记事本的功能,不过vi功能比记事本强大无限倍!^_^),现在实际使用的都是vim,它是vi的改进版本,所以现在的vi基本上就是vim了。 【vi能做什么】 第一个功能不用多说,vi可以编辑文本文件。至于其他的功能,多得无法列举,我只说我所知的一些典型的功能应用: (1)编辑文本文件 (2)方便地阅读程序源代码 (3)当文件目录浏览器来用 (4)提供编程、调试环境 (5)利用vi执行一些脚本文件(vi有自己的脚本文件语法) (x)等等等等...... 【vi的操作模式】   vi具有两种基本模式,为输入模式(或插入模式、编辑模式)和指令模式(或命令模式)。输入模式下输入字符,文本就会显示在屏幕上;而指令模式下输入字符就解释为一个输入命令并执行,而不会显示相应的字符。理解指令模式最简单方式就是想象平时剪切、复制以及粘贴数据时所发生的情况。 使用[Esc]键可以停止当前操作(插入或者命令)重新回到指令模式,准备接受新的指令。如果本来就在指令模式下面,将会响铃一下。 【最基本的使用】 这里提供了使用vi得最基本的操作,能够实现大多数的编辑目的。如果你肯花几分钟把“最基本的使用”的内容都实践一下,那么你至少可以独立地在vim中朝你想要得方向“前进”了。如果你不想学习,那么就把它当作一个“字典”吧。 *用vi打开一个文件: 输入“vi filename”. 这里,filename就是你要打开的文件的名字,默认打开文件后vi处于指令模式。 *进入编辑模式编辑打开的文件: 输入“i”. 或输入“a”. 进入编辑模式后,你可以直接敲入想要输入的字符到文件,两者的区别是i在当前字符前面开始插入,a在当前字符后面开始插入。 *退出编辑模式: 输入“[Esc]”. 这样,将返回指令模式,准备接收你要传达给vi的指令并执行,如果之前已经在指令模式下,那么系统将响铃提醒一下。 **以下命令都是在命令模式下进行: *撤销修改: 输入“u”. 这里,相比以前的vi来说,vim支持多步撤销。 *恢复修改: 输入“[Ctrl]r”. 这里,和撤销命令相反,是撤销的撤销,也可多步。 *复制行到剪切板: 输入“yy”. *复制选定内容到剪切板: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“y”。 这里,开始输入v使vi临时进入了一个"选择模式",输入方向键可以选择,输入y将选择的内容复制剪切板。 *删除行: 输入“dd”. 注意,vi的删除等价于剪切,删除的内容会保存到剪切板中。 *删除选定内容: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“d”。 这里,开始输入v使vi临时进入了一个“选择模式”,输入方向键可以选择,输入d将选择的内容删除。 *粘贴: 输入“p”. 这样会将剪切板的内容粘贴到光标位置或者光标下一行。 *查找字符并定位到第一个匹配处: 输入“/character”. 这里character是待查找的字符,只要先输入/,再输入待查字符,最后回车即可定位到第一个匹配的字符处。 *定位到匹配查找的下一个字符处: 输入“n”. *定位到匹配查找的上一个字符处: 输入“N”. *保存文件: 输入“:w”. 注意w前面的':',输入':'之后,vim会将':'之后的输入解释为待执行的指令。 *退出: 输入“:q”. 这里,如果文件没有保存,将提示无法退出,除非你强制退出,不保存文件,或者保存退出。 *强制退出: 输入“:q!”. *保存退出: 输入“:wq”. 或输入“ZZ”. *察看帮助 输入":help". ** 另外还有一个简易的教程: 输入命令:vimtutor.

65,198

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧