转:浅析windows下字符集和文件编码存储/utf8/gbk

Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值 文章目录前言简述ASCIIGBKUnicodeUTF-8应用场景开发环境编码转换16进制数值转换为16进制字符16进制数值转化为字符串16进制字符串转换为Unicode字符串Unicode字符串转化为16进制字符串总结参考资料 前言 字符编码方式多种多样,往往不同的应用、不同的设备、不同的系统上使用的字符编码不同,因此想要设计鲁棒性强的软件,就必须掌握对字符编码的转化机制和具体实现,特别是在Qt这... 阅读详情

最近老猿在学习文件操作及网络爬虫相关知识,发现字符集及编码的处理非常重要,而老猿原来对此了解并不多,因此找了几篇文章看了一下,将老猿认为比较的相关文章转载一下。感谢各位原创大神!

1,字符集

这里主要讲两种字符集,DBCS和UCS

DBCS即双字节编码字符集,最初的计算机只有ASCII码,发展至今,不能表示中文怎么办,于是中国人制定了GBK2312,以及后面陆续扩展并向下兼容的GBK,GB18030.

Unicode学名是“Universal Multiple-Octet Coded Chasracter Set”,简称UCS,他只兼容ANSI,为啥会有Unicode出现呢,因为在使用DBCS的时候,各个国家都有自己的一套字符集,于是非常的混乱的,不能正常显示所有字符,微软使用代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,后来国际组织决定指定一套全球统一字符集,就是Unicode了。

UCS只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的UCS编码是6C49,

我可以用4个ascii数字来传输、保存这个编码;也可以用utf-8编码:3个连续的字节E6 B1 89来表示它。

关键在于通信双方都要认可。UTF-8、UTF-7、UTF-16都是被广泛接受的方案。

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)

0000 – 007F 0xxxxxxx

0080 – 07FF 110xxxxx 10xxxxxx

0800 – FFFF 1110xxxx 10xxxxxx 10xxxxxx

UCS-2就是windows的宽字符,也就是utf16编码。

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001,

用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

2,BOM

BOM是在一个文本文件之前,用来标记改文件编码方式的一种记录方式,windows下是这样做的,linux不知道。

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

假如文件用UTF8无BOM格式来保存文件,那就不能单纯的依靠BOM头来判断是否是utf8编码的,而要对文件中的数据进行简单的编码分析来确定文件的编码格式,也就是对文件的二进制进行分析,和对应编码的字符集进行匹配,最终确定其编码格式。

一个简单的小例子,用windows的notepad写一个文件,记录下“联通”两个字,关闭打开后,发现文件乱码了,为什么呢?就是文件编码是被错误导致的。

notepad存盘默认用的ansi编码,也就是对应gbk字符集。

联通的gbk字符集是“C1 AA CD A8”

C1 AA 对应的二进制: 1100 0001, 1010 1010

CD AB 对应的二进制: 1100 1101, 1010 1000

注意看红色的部分,刚好和上面UTF8的编码结构完全一致,因此才误将其认为是utf8无BOM编码的文件。可以使用notepad++打开来查看这个文件的编码格式,确实是UTF8无BOM格式。

ansi编码,ascii码用单字节ascii码值存储,非ascii码表内的,使用对应的dbcs字符集编码之来存储,因此同一个“汉字AB”对应的ansi编码存储的文件是 BA BA D7 D6 41 42

最后,统一看下。

"汉"字的gbk,utf8(有BOM),utf8(无BOM)utf16(小端),utf16(大端),二进制分别是

BA BA , EF BB BF E6 B1 89 ,E6 B1 89 , FF FE 49 6C , FE FF 6C 49

本文转自:
浅析windows下字符集和文件编码存储/utf8/gbk http://seanyxie.com/a/jisuanjijichu/caozuoxitong/2019/0409/32.html

如何gbk转unicode、gbk转utf8、ansi转unicode、ansi转utf8、tchar转ansi、ansi转tchar? 如何gbk转unicode、gbk转utf8、ansi转unicode、ansi转utf8、tchar转ansi?很多人在编码过程中经常会遇到处理字符串的编码,比如gbk、unicode、utf8等, 实际上字符串还是那个字符串,但是由于存储的格式不同,所以才有那么多的编码。 后来微软又在其VS中搞出来一个tchar,其实就是一个可变格式, 如果你的项目是使用多字节字符集,那么就会变为char,对应于ansi编码, 如果你的项目是使用unicode字符集,那么就会变为wchar_t,对应于unicode编码 阅读详情

相关推荐

C++ MFC/BCG编程(四):字符集与字符编码、_T宏

Unicode即Universal Multiple-Octet Coded Character Set,通用多八位编码字符集。 国际组织制定的可以容纳世界上所有文字和字符的编码方案,分为多个平面,一般常用0号平面也叫基本多文种平面(Basic Multilingual Plane)即0000-FFFF来表示一个字符。UTF-8是最主流的编码方式。

qq_39281631的博客 1261

浅析windows下字符集和文件编码存储/utf8/gbk

查看更多 windows下字符集和文件编码存储/utf8/gbk 1,字符集 这里主要讲两种字符集,DBCS和UCS DBCS即双字节编码字符集,最初的计算机只有ASCII码,发展至今,不能表示中文怎么办,于是中国人制定了GBK2312,以及后面陆续扩展并向下兼容的GBK,GB18030. Unicode学名是“Universal Multiple-Octet Coded Chasract...

Seanyxie Blog 1631

从零开始掌握机械臂运动控制:原理、建模与实践

本文系统介绍了机械臂运动控制的核心原理与实践方法。从运动学与动力学建模的基础理论出发,详细解析了经典PID控制与现代MPC(模型预测控制)算法的应用,并通过ROS与MATLAB仿真案例,指导读者从零开始实现机械臂的轨迹规划与精准控制,为工业自动化应用提供完整的技术路径。

weixin_29099217的博客 565

Windows字符编码

基础知识 计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。 字符集(Charset):是一个系统支持的所...

南宫封清的博客 1004

[原创]Linux 802.11n CSI tool Monitor模式

Linux 802.11n CSI tool Monitor模式 使用AP模式的缺陷在于ping 命令速度比较慢,且不能精确控制发送的参数,比如接收的包数量是不可控的。Monitor模式可以调制发送速率、发包数量、发送天线个数、HT模式、short/long guard interval等等,因此调通Monitor模式是必须的。期间参考了博主沃一德的CSI Tool安装使用讲解,对他的工作表示感...

u014645508的博客 1万+

数学分析五领域全景:实分析、复分析、泛函分析、傅里叶分析、凸分析

五种分析,五种视角,同一个目标。理解一个系统,首先要找到它的不变量。

li880862的博客 192

详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换

目录1、概述2、Visual Studio中的字符编码3、ANSI窄字节编码4、Unicode宽字节编码5、UTF8编码6、如何使用字符编码7、三种字符编码之间的相互转换(附源码)7.1、ANSI编码与Unicode编码之间的转换7.2、UTF8编码与Unicode编码之间的转换7.3、ANSI编码与UTF8编码之间的转换8、Windows系统对使用ANSI窄字节字符编码的程序的兼容9、字符编码导致程序启动失败的案例1、概述在日常的软件开发过程中,会时不时地去处理不同编码格式的字符串,特别是在处理文件路径的

smartDMer的专栏 6553

人形机器人系列——硬件介绍

人形机器人是多领域交叉技术的产物,主要由三大系统组成:感知系统、决策系统和执行系统。感知系统感知系统是人形机器人获取外界信息的途径,主要由各种传感器组成。其中,视觉传感器用于获取图像信息,如摄像头、激光雷达等;触觉传感器用于感知触碰和压力,如力/力矩传感器、声学传感器等。这些传感器收集到的信息为机器人的决策和执行提供基础。决策系统决策系统是人形机器人的大脑,负责处理和决策各种信息。它由芯片和算法组成。芯片是硬件基础,提供计算能力;算法是软件基础,用于处理和分析传感器收集到的信息,并做出相应的决策。执行系统。

liangwqi的博客 1万+

win32命令行正确显示utf8编码中文

想在windows cmd窗口中查看utf-8中文,需要先执行以下步骤 chcp 65001 将CMD窗口切换成UTF-8代码页 在命令行标题栏上点击右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida onsole",然后点击确定将属性应用到当前窗口 可以尝试在CMD窗口中查看一个utf-8格式的文件 type <filename...

mzr122的专栏 759

全志T113 Tina5.0开发:(一)添加自己的板级支持包

3.验证 先执行 source build/envsetup.sh ,然后lunch,下图可见9就是我们自己添加的板子。2. 1)修改 t113-evb1.mk重命名为t113-ws_devboard。我使用的spinand,只需要修改openwrt里面的文件即可。以下内容仅作为自己笔记,如果错误欢迎留言指出。修改t113-ws_devboard。

u014428915的博客 1164

零基础吃透!Python爬虫实战:超详细爬取小红书图文,解析封面+标题+文案全流程

本文为零基础开发者提供小红书图文爬取全流程指南,针对动态加载、严格反爬等核心痛点,从环境配置到数据解析详细讲解。主要内容包括: 核心特性分析:动态加载机制需抓包获取真实接口,严格反爬依赖Cookie验证和请求头伪装 环境准备:Python 3.8-3.10环境,使用requests/beautifulsoup4等库,通过浏览器开发者工具获取有效Cookie 实战步骤: 定位关键API接口(note/list) 配置请求头(含Cookie/User-Agent/Referer) 实现分页爬取和异常处理 解析封

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 730

Windows和linux的utf8,Windows与Linux UTF8/GBK相互转换

windows使用api, linux使用iconvchar *_utf8_2_gbk (const char *content) {#if (defined __WIN32__) || (defined WIN32)int len = 0;char *dst = NULL;unsigned short *ansi = NULL;len = MultiByteToWideChar(CP_UTF8,...

weixin_33462167的博客 212

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1275

java中GBK与UTF-8编码的转换

java中文件编码的转换,主要说明了GBK与UTF-8编码之间的转换, 还介绍了利用cpdetector开源库确定文件文件(网页)编码的方法。

第七宇林的博客 8万+

模型实战(16)之StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解

StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解

yohnyang的博客 1770

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

UTF8和gbk编码转换(一)

在项目中,经常遇到将gbk编码与utf8编码进行转换的情况。如在linux系统中对windows下文件进行操作,或是windows下对Linux文件操作。这是因为在Windows下的默认字符编码格式是GBK(GB2312),而Linux下是UTF-8。 UTF-8:Unicode Transformation Format-8bit,是用以解决国际上字符的一种多字节编码,它对英文使用8位

u011361576的专栏 2501

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

区别:字符集 字符编码 存储编码 ASCII Unicode UCS UTF ANSI UTF-8 UTF16 UTF32 GB2312 GBK GB18030 BIG-5

开发过程中,使用文本文档、Word文档过程中,经常会遇到乱码,这些乱码是怎么产生的? 字符存储都与哪些因素有关? 经常听到的字符集、字符编码是什么?文件存储编码是什么? Windows记事本另存为时可以选择:ANSI、Unicode、Unicode Big Ending、UTF-8,分别表示什么?如何转换?Windows系统如何区分一个txt文档是什么编码的? 基本概念 字符(Chara...

smartDMer的专栏 2313

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Windows Console的字符集和编码问题

最近在玩Hadoop和Hive, 因为这类框架还处在必须使用命令行交互的阶段。 不得不使用Windows Command 来访问hive。 (要问我问什么要再windows上装hadoop, 因为我没有linux 虚拟机啊。。。) 测试的WIndows是2008 R2 英文版, 其实这方面的问题从有Windows以来就一直存在。 要正确的显示一个字符,需要有几个基本的概念。 首先要知道

tiimfei的专栏 4364

Linux C++字符集转换实战:基于iconv的GBK/UTF-8编码处理方案

字符集与编码是计算机处理文本信息的基础,它定义了字符与二进制数据的映射规则。在跨平台、多语言环境的软件开发中,不同的字符集编码(如GBK、UTF-8)会导致数据交换时出现乱码问题,其核心原理在于编码规则的不匹配。正确处理字符集转换对于保障数据的一致性与可读性具有重要技术价值,尤其在涉及文件I/O、网络传输、终端显示及与第三方库交互的应用场景中。本文聚焦于在Linux C++环境下,通过封装iconv库,实现一套高效、可靠的字符集转换方案,重点解决GBK与UTF-8编码间的互转难题,并提供了完整的RAII风格

weixin_34128237的博客 465

漫谈字符集和编码

漫谈字符集和编码作为程序员,如果没有被字符集和编码坑过那说明你的人生太不完美了,哈哈。1. 字符集和编码的关系在最开始遇到字符集和编码的问题时,那时候Unicode和utf-8还未完全推广开来,遇到的很多是gbk和其它编码之间转换的问题。像gbk之类的基本就是一个字符集对应一种编码,所以那时候就简单的理解“字符集和编码是同一个概念”,直到后来遇到Unicode和utf-8、utf-16,才发现这两个

liuxingen的专栏 3863

别再混淆字符集和编码了!GBK、UTF-8、ASCII编码选择与系统配置全指南(Windows/Linux/macOS)

本文深入解析字符集与编码的核心区别,对比GBK、UTF-8、ASCII等主流编码标准的特点与应用场景,并提供Windows、Linux、macOS系统的编码配置指南。通过实战案例和最佳实践,帮助开发者解决乱码问题,实现跨平台数据兼容,提升开发效率。

weixin_30301449的博客 537

windows中mysql5.5.10默认字符集修改,字符编码设置

 1、找到my.cnf配置文件如果/etc/目录下没有my.cnf配置文件,请到/usr/share/mysql/下找到*.cnf文件,拷贝其中一个到/etc/并改名为my.cnf)中。命令如下:[root@test1 mysql]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf   mysql5.5.10默认字符集修改,字

sunlin5000的专栏 1万+

Windows C++编码转换实战:GBK与UTF-8互转原理与方案详解

字符编码是软件开发中处理文本数据的基础概念,它定义了字符与二进制数据之间的映射规则。在Windows平台上,由于历史原因,系统默认使用GBK等本地编码,而现代软件生态如Web API、开源库和跨平台应用普遍采用UTF-8编码,这种编码差异导致了数据交换时的“乱码”问题。其核心原理在于,Windows内核使用UTF-16作为内部表示,因此GBK与UTF-8之间的转换必须通过UTF-16这个“中间人”进行,这涉及到多字节字符集与宽字符的转换机制。从技术价值看,可靠的编码转换是确保数据一致性、实现系统互操作性和提

weixin_33906657的博客 445

批量将Java源代码文件的编码从GBK转为UTF-8

本文转自:http://my.oschina.net/binny/blog/62959

liu_qiqi的专栏 1万+

C++ ifstream 读入 utf8 txt 变为乱码如何解决?为什么会变为乱码?

本篇介绍了这个问题的原理分析以及解决策略,需要耐心阅读并理解透彻。

alan16356的博客 3582

ASCII、GBK、UTF8、ANSI

GBK就是在保存你的帖子的时候,一个汉字占用两个字节。。外国人看会出现乱码,此为我中华为自己汉字编码而形成之解决方案。 UTF8就是在保存你的帖子的时候,一个汉字占用3个字节。。但是外国人看的话不会乱码,此为西人为了解决多字节字符而形成之解决方案。 ASCII(ISO-8859-1)是鼻祖,最简单的方式,字节高位为0 GB2312、GBK、GB18030,这几个是中文编码方式,并向下兼容。GB2312包含7000多个汉字和字符,GBK包含21000多个,GB18030更厉害,到了27000多个。他们都是用2

Java、C语言、嵌入式开发,计算机科学与技术专业 1148
上一篇: 译文:二进制序列类型 --- bytes, bytearray
下一篇: 转:使用DOS命令chcp查看windows操作系统的默认编码以及编码和语言的对应关系
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值