现象:
当你在 windows 的记事本里新建一个文件,输入"联通"两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!
分析:
这时我们看看utf8的编码格式:
UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
在保存这个操作中,windows默认保存的编码是ANSI(实际上应该是GBK)。
这样联通这两个字的二进制内码是:(一个字占两个字节)
c1 1100 0001
aa 1010 1010
cd 1100 1101
a8 1010 1000
巧合的地方在于联通这两个字的ANSI编码符合utf8编码的第二个模板。
第一二个字节、第三四个字节的起始部分的都是"110"和"10",正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了"00001 101010",再把各位对齐,补上前导的0,就得到了"0000 0000 0110 1010",不好意思,这是UNICODE的006A,也就是小写的字母"j",而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有"联通"两个字的文件没有办法在记事本里正常显示的原因。
可以认为,当文档中的所有字符的二进制编码在C0≤AA(第一个字节)≤DF 80≤BB(第二个字节)≤BF时,记事本都无法确认文本的编码格式,就按照UTF-8的格式来显示。
另外,当我们在记事本编写"联通",然后另存为,选择UTF-8的格式,保存。再重新打开的时候,就不会有乱码。用UltraEdit的十六进制打开可以看到 EF BB BF E8 81 94 E9 80 9A。其中 EF BB BF 是UTF-8编码格式的标记。当用记事本打开文件时,读到EF BB BF 时,就确定这是UTF-8编码格式的字符。所以打开时不会看到乱码。同理与Unicode、UTF-16。
Unicode的"联通"的十六进制编码:FF FE 54 80 1A 90 。其中FF FE 是Unicode的标记。
UTF-16的"联通"的十六进制编码为:FE FF 80 54 90 1A。这里的FE FF是UTF-16的标记。
这里提一下MBCS ,Multi-Byte Chactacter System,多字节字符系统,通常也称为ANSI字符集。
MBCS文本没有这些开头的字符集标记。更不幸的是,一些早期的和一些设计不良的软件在保存Unicode文本时不插入这些位于开头的字符集标记。因此,软件不能依赖于这种途径。这时,软件可以采取一种比较安全的方式来决定字符集及其编码,那就是弹出一个对话框来请示用户,例如将那个“连通”文件拖到MS Word中,Word就会弹出一个对话框。
如果软件不想麻烦用户,或者它不方便向用户请示,那它只能采取自己“猜”的方法,软件可以根据整个文本的特征来猜测它可能属于哪个charset,这就很可能不准了。使用记事本打开那个“连通”文件就属于这种情况。
参考于:http://www.360doc.com/content/05/1231/13/2778_52114.shtml
分享到:
相关推荐
打开记事本汉字显示乱码双击导入注册表,打开记事本汉字显示乱码双击导入注册表,
记事本默认使用的是ANSI编码,但在处理多语言或者非ASCII字符时,可能会出现乱码问题。下面将详细介绍如何在VB中正确地读取记事本文件,并将其内容赋值给一个string类型的变量。 首先,我们需要了解VB中的`...
记事本打开文件乱码怎么办?.docx
【电子记事本需求分析】 在当今快节奏的生活中,信息量激增,人们往往难以记住所有的安排,因此,记事本成为了管理日常事务的重要工具。随着计算机和手机技术的发展,电子记事本逐渐取代了传统的纸质记事本,成为...
Keil uVision使用的是Unicode编码,而默认的记事本则通常使用GB2312或ANSI编码,这种差异使得在两者之间直接复制粘贴中文字符时会出现乱码。 解决这个问题的方法如下: 1. **修改Keil的输出设置**: 在Keil ...
《Xluo迷你记事本:C#编程实现的多彩文本编辑器》 在IT行业中,文本编辑器是程序员和日常用户不可或缺的工具之一。它们提供了基础的文字输入、编辑和格式化功能,甚至支持更高级的特性。Xluo迷你记事本就是这样一款...
标题中的"C#记事本(模仿系统记事本写的)"是指使用C#编程语言开发的一个文本编辑器程序,它的设计灵感来源于操作系统自带的记事本应用程序。开发者试图通过这个项目来实现与系统记事本相同的功能,以供初学者学习和...
2. 创建记事本进程:要创建记事本,我们需要调用`CreateProcess`或`ShellExecute`这两个API函数之一。`CreateProcess`能更精细地控制新进程的创建,而`ShellExecute`则更简单,可以直接打开一个应用程序。在这里,...
标题中的"C#写的记事本"指的是使用C#编程语言开发的一个文本编辑器,它旨在模仿Windows操作系统内置的记事本应用程序。C#是微软公司推出的一种面向对象的、现代的编程语言,常用于开发Windows桌面应用、Web应用以及...
在这个“易语言打开记事本并写入内容”的主题中,我们将探讨如何利用易语言来实现这样的功能,包括打开系统自带的记事本程序并向其中写入特定的内容。 首先,我们要理解易语言中的几个关键概念。`取得窗口_`是...
在“简易笔记本 简易记事本 系统分析课程设计”这一项目中,我们主要探讨的是如何通过系统分析的方法来设计一个简单的记事本应用程序。系统分析是软件工程中的一个重要阶段,它旨在理解用户的需求,定义问题,并为...
javafx写的记事本
《VB.NET实现的多功能记事本详解》 在编程领域,VB.NET是一种广泛使用的编程语言,尤其在开发桌面应用程序方面有着显著的应用。本篇文章将详细探讨一个由VB.NET编写的记事本程序,该程序相较于网络上常见的记事本...
用java写的记事本,1000行代码,基本上所有的功能都全了(和微软系统自带的记事本的相似度>70%) 其中菜单里新建模块的代码如下: // 菜单 // 新建(N)按钮事件监听 newTextItem.addActionListener(new ...
"易语言打开记事本并写入内容源码"是一个基础的程序示例,它展示了如何使用易语言与操作系统进行交互,控制外部应用程序,如记事本,并向其写入数据。下面我们将详细讨论这个知识点。 首先,易语言提供了丰富的系统...
用Java编写的简易记事本,类似于我们平常用的记事本。
标题中的“日历记事本Java写的”表明这是一个使用Java编程语言开发的日历应用程序,它具有记事本功能,能够帮助用户记录日常生活中的事件和提醒。这个应用可能结合了日历视图和文本编辑功能,使得用户可以在查看日期...
java记事本 完美记事本 程序 设置颜色 背景 文字大小
Excel出现乱码的原因有很多,以下是一些常见的原因: * 文件编码不正确:如果文件的编码不正确,Excel可能无法正确地读取文件中的中文字符。 * 字符集不匹配:如果文件中的字符集与Excel的字符集不匹配,也可能导致...
【标题】"记事本编写的贪吃蛇"是一款基于文本界面的小游戏,它通过简单的命令行输出在记事本中实现。贪吃蛇游戏的基本原理是控制一个由字符表示的蛇在有限的网格内移动,吃到食物后增长,同时避免撞到自身或边界。 ...