深入了解字符集和编码问题

日文字库Sjis码表 日文字库Sjis码表 sjis--gbk 立即下载

http://webcenter.hit.edu.cn/articles/2009/04-01/04193356.htm

一、什么是字符集?什么是编码? 

字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。 
一组抽象字符的集合就是字符集(Charset)。 
字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。 
一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。 
字符集的子集也是字符集。 

计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。 
制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。 
每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多是这个含义。 

二、有哪些字符集? 

ASCII: 
American Standard Code for Information Interchange,美国信息交换标准码。 
目前计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。 
它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。 
ASCII字符集由控制字符和图形字符组成。 
在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。 
所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。 
奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1。 
偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 

ISO 8859-1: 
ISO 8859,全称ISO/IEC 8859,是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准,现时定义了15个字符集。 
ASCII收录了空格及94个“可印刷字符”,足以给英语使用。 
但是,其他使用拉丁字母的语言(主要是欧洲国家的语言),都有一定数量的变音字母,故可以使用ASCII及控制字符以外的区域来储存及表示。 
除了使用拉丁字母的语言外,使用西里尔字母的东欧语言、希腊语、泰语、现代阿拉伯语、希伯来语等,都可以使用这个形式来储存及表示。 
    * ISO 8859-1 (Latin-1) - 西欧语言 
    * ISO 8859-2 (Latin-2) - 中欧语言 
    * ISO 8859-3 (Latin-3) - 南欧语言。世界语也可用此字符集显示。 
    * ISO 8859-4 (Latin-4) - 北欧语言 
    * ISO 8859-5 (Cyrillic) - 斯拉夫语言 
    * ISO 8859-6 (Arabic) - 阿拉伯语 
    * ISO 8859-7 (Greek) - 希腊语 
    * ISO 8859-8 (Hebrew) - 希伯来语(视觉顺序) 
    * ISO 8859-8-I - 希伯来语(逻辑顺序) 
    * ISO 8859-9 (Latin-5 或 Turkish) - 它把Latin-1的冰岛语字母换走,加入土耳其语字母。 
    * ISO 8859-10 (Latin-6 或 Nordic) - 北日耳曼语支,用来代替Latin-4。 
    * ISO 8859-11 (Thai) - 泰语,从泰国的 TIS620 标准字集演化而来。 
    * ISO 8859-13 (Latin-7 或 Baltic Rim) - 波罗的语族 
    * ISO 8859-14 (Latin-8 或 Celtic) - 凯尔特语族 
    * ISO 8859-15 (Latin-9) - 西欧语言,加入Latin-1欠缺的法语及芬兰语重音字母,以及欧元符号。 
    * ISO 8859-16 (Latin-10) - 东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。 
很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。 
但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。
而且在很多协议上,默认使用该编码。 

UCS: 
通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式,采用4字节编码。 
UCS包含了已知语言的所有字符。 
除了拉丁语、希腊语、斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语、格鲁吉亚语,还包括中文、日文、韩文这样的象形文字,UCS还包括大量的图形、印刷、数学、科学符号。 
    * UCS-2: 与unicode的2byte编码基本一样。 
    * UCS-4: 4byte编码, 目前是在UCS-2前加上2个全零的byte。 

Unicode: 
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。 
它是http://www.unicode.org制定的编码机制, 要将全世界常用文字都函括进去。 
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 
1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。 
但自从unicode2.0开始,unicode采用了与ISO 10646-1相同的字库和字码,ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值,使得两者保持一致。 
Unicode的编码方式与ISO 10646的通用字符集(Universal Character Set,UCS)概念相对应,目前的用于实用的Unicode版本对应于UCS-2,使用16位的编码空间。 
也就是每个字符占用2个字节,基本满足各种语言的使用。实际上目前版本的Unicode尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。 

UTF: 
Unicode 的实现方式不同于编码方式。 
一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。 
Unicode的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。 
    * UTF-8: 8bit变长编码,对于大多数常用字符集(ASCII中0~127字符)它只使用单字节,而对其它常用字符(特别是朝鲜和汉语会意文字),它使用3字节。 
    * UTF-16: 16bit编码,是变长码,大致相当于20位编码,值在0到0x10FFFF之间,基本上就是unicode编码的实现,与CPU字序有关。 


汉字编码: 
    * GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。 
    * BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。 
    * GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。 
    * GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。 

ANSI和Unicode big endia: 
我们在Windows系统中保存文本文件时通常可以选择编码为ANSI、Unicode、Unicode big endian和UTF-8,这里的ANSI和Unicode big endia是什么编码呢? 
ANSI: 
使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。 
在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。 
Unicode big endia: 
UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。 
Unicode规范中推荐的标记字节顺序的方法是BOM(即Byte Order Mark)。 
在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。 
Windows就是使用BOM来标记文本文件的编码方式的。 

三、编程语言与编码 

C、C++、Python2内部字符串都是使用当前系统默认编码 
Python3、Java内部字符串用Unicode保存 
Ruby有一个内部变量$KCODE用来表示可识别的多字节字符串的编码,变量值为EUC SJIS UTF8 NONE之一。 
$KCODE的值为EUC时,将假定字符串或正则表达式的编码为EUC-JP。 
同样地,若为SJIS时则认定为Shift JIS。若为UTF8时则认定为UTF-8。 
若为NONE时,将不会识别多字节字符串。 
在向该变量赋值时,只有第1个字节起作用,且不区分大小写字母。 
e E 代表 EUC,s S 代表 SJIS,u U 代表 UTF8,而n N 则代表 NONE。 
默认值为NONE。 
即默认情况下Ruby把字符串当成单字节序列来处理。 

四、为什么会乱码? 

乱码是个老问题,从上面我们知道,字符在保存时的编码格式如果和要显示的编码格式不一样的话,就会出现乱码问题。 
我们的Web系统,从底层数据库编码、Web应用程序编码到HTML页面编码,如果有一项不一致的话,就会出现乱码。 
所以,解决乱码问题说难也难说简单也简单,关键是让交互系统之间编码一致。 

五、有没有万金油? 

在如此多种编码和字符集弄的我们眼花缭乱的情况下,我们只需选择一种兼容性最好的编码方式和字符集,让它成为我们程序子系统之间 
交互的编码契约,那么从此恼人的乱码问题即将远离我们而去 -- 这种兼容性最好的编码就是UTF-8! 
毕竟GBK/GB2312是国内的标准,当我们大量使用国外的开源软件时,UTF-8才是编码界最通用的语言。 

反激开关电源变压器设计实战:从理论到绕制的完整流程解析 本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。 阅读详情

相关推荐

半导体AMHS天车振动控制:从0.5G到超低振动的技术演进与工程实战

在先进晶圆厂中,自动化物料搬运系统(AMHS)的天车如同空中出租车,承担着晶圆盒(FOUP)在洁净室各工艺区间的转运任务。然而,当天车加减速、过弯或抓取时产生的机械振动通过轨道梁和建筑结构传递至光刻机等敏感设备,便可能直接威胁套刻精度与良率。传统被动减振方案依靠橡胶垫和弹簧,在0.5G指标时代曾行之有效,但在EUV光刻和先进制程面前已力不从心。主动振动控制技术通过传感器、控制器与作动器构成的闭环系统,在轨道吊点和机械手端实时输出反向力抵消振动,配合磁悬浮走行、轻量化结构及调度系统的路径优化,将振动从0.5G

weixin_29188043的博客 341

对于 Shift-JIS 编码的理解 (win10中 查看 Shift-JIS 编码 コード)

■简介 Shift_JIS-2004 is the JIS X 0213 version of Shift_JIS encoding. It is a superset of Shift_JIS. In this encoding, JIS X 0213 double-byte code is transformed by a formula. 0x20-0x7F: JIS X 0201 Latin set (ASCII variant for Japanese) 0xA1-0xDF: JIS X 0

sun0322 1万+

数字IC后端层次化Hierarchical Flow子系统Sub-System模块 block partition和pin assignment细节盘点

数字IC后端培训教程之Hierarchical Flow子系统block partition和pin assignment详细教程

weixin_37584728的博客 1603

深入了解字符集和编码

[b]一、什么是字符集?什么是编码?[/b] 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。 一组抽象字符的集合就是字符集(Charset)。 字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。 一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。 字符集的子集也是...

hideto 362

OpenWRT端口转发与NAT环回冲突的排查与解决

本文详细解析了OpenWRT路由器中端口转发与NAT环回功能冲突导致的内网访问故障。通过生活化类比阐明两者工作原理,提供从基础诊断到内核参数调整、LuCI选项配置及手动编写iptables规则的多套解决方案,并给出进阶排查思路,帮助用户彻底解决内网无法通过公网地址访问服务的常见问题。

weixin_29243279的博客 505

华为云HCS解决方案笔记HUAWEI CLOUD Stack【面试篇】

华为云解决方案介绍、华为云服务介绍,华为云网络平面规划等

weixin_48375618的博客 1万+

字符集详解(学习,看一篇就够了)

本文致力于一篇文章就可以让初学者对字符集编码有一个全面的认识,为将来开发项目充实其理论基础,为解决BUG提供思路。

qq_42068856的博客 4万+

WorkBuddy 集成 飞书CLI,全程10分钟,丝滑无比,老板要注意了...

飞书CLI实测:10分钟实现AI操控飞书办公 飞书CLI作为命令行工具,让用户通过简单命令完成飞书各项操作。本文记录了从安装到使用的完整过程:一键安装仅需10分钟,支持200多条命令覆盖飞书全部功能,与AI结合后可实现自然语言办公。实测中成功用语音指令创建了7天发文计划日程,验证了其便捷性。虽然首次认证存在超时问题,但整体体验流畅。该工具将复杂操作简化为自然语言指令,大幅提升办公效率,特别适合需要频繁使用飞书的用户。后续还将探索更多自动化办公场景。

三棱球的专栏 1142

文件编码 ANSI、GBK、GB2312、MS936、MS932、SJIS、Cp943C 、EUC-JP 、EBCDIC 等等之间的区别与联系

■前言 暂且不谈 UTF-8,Unicode (UTF-8只是Unicode的一种实现方式) https://blog.youkuaiyun.com/sxzlc/article/details/106084402 ← win10下,以十六进制形式查看文件 关于文件编码的描述,有很多种描述方式 中文:ANSI,GBK,GB2312, MS936 日文:ANSI, MS932,SJIS(SHIFT JIS),Windows-31J,EUC-JP,ISO-2022-JP 英文:ANSI, ASCII,MS437.

sun0322 2万+

[统计模型] 基于R的潜在剖面分析(LPA)

本文主要介绍基于R进行潜在剖面分析(Latent Profile Aanalysis, LPA)。 关于潜在类别分析LCA/潜在剖面分析LPA的概念和区别,可以参考一下这篇文章: 潜在类别分析LCA \潜在剖面分析LPA介绍https://www.jianshu.com/p/4c830094131e?utm_campaign=maleskine 但是此文对潜类别分析的阐释还比较生涩,而且没有具体的代码编写、模型优选等内容。本文旨在丰富LPA的内容,并希望和大家交流、共同进步。 1. 什么是潜类别分.

bigstar863的博客 1万+

【Qt开发教程】网络代理QNetworkProxy类详解及实战应用

QNetworkProxy 提供了一种灵活而强大的方式来配置和管理网络代理,通过设置代理类型、主机、端口和认证信息,可以使应用程序的所有网络请求通过代理服务器进行。结合 QNetworkProxyFactory 可以实现动态代理选择和自动配置,提高应用的网络通信能力和安全性。在实际应用中,通过合理设置代理、处理代理认证和错误情况,可以确保应用程序在复杂的网络环境中稳定运行,为用户提供可靠的网络访问体验。

科技改变人类,技术成就未来 1541

[转]深入了解字符集和编码问题

一、什么是字符集?什么是编码? 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。 一组抽象字符的集合就是字符集(Charset)。 字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。 一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。 字符集的子集也是字符...

imti_apollo的博客 167

pycharm一直选择不了conda正确路径弹框报错:latinit property envs_dirs has not been initialized...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2908

深入了解字符集和编码问题 2010-11-9 17:42

一、什么是字符集?什么是编码? 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。 一组抽象字符的集合就是字符集(Charset)。 字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。 一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。 字符集的子集也是字符

laohu6599的专栏 317

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

字符集编码的识别

字符集编码的识别(一)读取文本文件或者接收字节流时需要搞清字符编码才能正确处理,编码识别错误是出现乱码的主要原因。理解编码识别方法之前建议阅读:常用字符集编码的概要特性(一)和 常用字符集编码的概要特性(二)。通过约定识别为了接收字节流时能正确识别编码,很多情况下发送字节流的同时会把字节流对应的编码发送给接收方,这种情况可以理解为发送和接收双方的约定。HTTP协议就有这样的约定

Leo 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MySQL中的字符集和比较规则

如果你还因为MySQL乱码摸不着头脑,如果你只知道存储emoji表情时,需要使用utf8mb4,但却不知道为什么,那么本篇文章或许能解开你的一些疑惑。 字符集和排序规则 什么是字符集: 字符集指的是某个字符范围的编码规则,一个字符映射成一个二进制数据的过程也叫做编码,将一个二进制数据映射到一个字符的过程叫做解码。 什么是比较规则: 比较规则是针对某个字符集中的字符比较大小的一种规则。在我们确定了字符集表示字符的范围以及编码规则后,怎么比较两个字符的大小呢?最容易想到的就是直接比较这两个字符对应的二进制编码的

cj_ervin的博客 823

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

字符集和字符编码&为什么乱码是问号?

什么是字符集和字符编码? 字符:在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信息。即一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等。 字符集:多个字符的集合。例如GB2312是中国国家标准的简体中文字符集,GB2312收录简化汉字(6763个)及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。 字符编码:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列

qq_50864729的博客 3099

字符编码

为什么写这篇文章   字符编码的问题一直以来困然着我,每次遇到相关问题需要解决,都要重新去搜索学习。但是,网上的一些文章往往也是自相矛盾的半成品,再加上windows的奇怪命名,导致我对这些概念似懂非懂,所以想借此机会重新理顺这些概念顺带学习。 相关概念 字符集(character set)   为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)。 编码规则/编解码(encoding)   将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程) 字

306

Windows字符编码集大全

在使用Windows系统的电脑办公,经常会遇到乱码问题,原因一般都是字符集不一致导致; 查看字符集 命令行中执行 chcp 设置字符集 chcp 代码页 国内常用字符集编码一般是936(GBK)和65001(UTF-8) 字符集编码(代码页) 名称 中文名称 37 IBM037 IBM EBCDIC(美国 - 加拿大) 437 IBM43

ezconn的博客 5495

字符集与字符编码

字符编码和字符集的关系,以及它们起到的作用

weixin_43872993的博客 1881

【十分钟搞清字符集和字符编码】

本文将简述字符集,字符编码的概念。以及在遭遇乱码时的一些常用诊断技巧背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题。当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难。本文就将会从原理方面对字符集和编码做个简单的科普介绍,同时也会介绍一些通用的乱码故障定位的方法以方便读者以后能够更从容的定位相关问题。在正式介绍之前,先做个小申明:如果你希望非常精确的理解各个名词的解释

u014714340的专栏 675
上一篇: XML认证教程,第 1 部分: XML简介
下一篇: BugZilla 安装心得,以及与Mantis的比较
sanlinux
博客等级 码龄17年 92粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值