Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >有关字体,语言,字符编码相关的基础知识,询问chatgpt所得

有关字体,语言,字符编码相关的基础知识,询问chatgpt所得

作者头像
拿我格子衫来
发布于 2025-04-25 02:23:44
发布于 2025-04-25 02:23:44
7000
代码可运行
举报
文章被收录于专栏:TopFETopFE
运行总次数:0
代码可运行

学习这个知识点的背景是,我需要做一个 在canvas 上书写矢量文本的功能, 使用opentype来加载字体文件,并将内容转换为 svg,导入画布。 但是有些字体文件 是不包含 一些其他语言的字符的。就可能出现 “无效字符”。

花了点时间研究字体文件与语言系统,以及字符编码 之间的关系和逻辑。

问题 Unicode 范围 该如何理解?有多少个字符范围?字符,字体是怎么分类的?

答案1:

你的问题非常关键,也是多语言文本渲染中经常遇到的核心难点。我们来逐步拆解 “Unicode 范围”、“字符”、“字体分类” 这几个概念,帮你建立一个完整清晰的理解框架。


🧠 一、什么是 Unicode 范围?

Unicode 是一个全球字符集标准,目的是为所有语言中的所有字符分配一个统一的编码。它把 字符按照功能、语言或书写系统划分为“区段”,每个区段就是一个 Unicode 范围

比如:

Unicode 范围

字符示例

用途

U+0041 - U+007A

A-Z, a-z

拉丁基本字母

U+0400 - U+04FF

А-Я, а-я

西里尔字母(俄语、乌克兰语等)

U+4E00 - U+9FFF

中、国、文

常用汉字

U+0370 - U+03FF

Α, β, γ

希腊字母

U+00C0 - U+00FF

À, ç, ñ

拉丁扩展-A(法语、西语等变音)

U+1F600 - U+1F64F

😀, 😢

Emoji

所以 你不需要按“语言”去处理字体,而是按“字符属于哪个 Unicode 范围”来选对应字体


🎨 二、字体是如何分类和覆盖字符的?

一个字体(.ttf.otf)并不会支持所有 Unicode 字符,而是只包含 一部分字符的字形(glyph)

我们可以这样理解:

  • 英文字体(如 Roboto、Arial)通常只覆盖拉丁字母(ASCII + Latin Extended)
  • 中文字体(如 思源宋体、Noto Sans CJK)会包含大量汉字,也通常包含基本拉丁字符用于混排
  • 通用字体(如 Noto 系列)覆盖范围非常广,适合做 fallback 用字体

字体的支持范围可以通过工具查看,如:

  • FontDrop 上传字体看支持哪些 Unicode 范围
  • opentype.js 中的 font.tables.cmap 也能拿到它支持的字符编码范围

🧩 三、实战应用:如何用字符 Unicode 范围选字体?

你可以在处理每一个字符时:

  1. 获取它的 Unicode 编码(char.codePointAt(0)
  2. 判断它落在哪个 Unicode 范围
  3. 按照你加载的字体支持情况选择合适的字体渲染

比如伪代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function pickFontForChar(char) {
  const code = char.codePointAt(0);
  if (code >= 0x4E00 && code <= 0x9FFF) {
    return chineseFont;
  } else if (code >= 0x0400 && code <= 0x04FF) {
    return cyrillicFont; // 俄语
  } else if (code >= 0x00C0 && code <= 0x00FF) {
    return latinExtendedFont; // 法语、西语等
  } else {
    return defaultLatinFont; // 基础英文
  }
}

你也可以加载 Noto Sans 系列作为 fallback 字体,它们专门是 Google 推出的覆盖全球字符集的字体库系列。


🧠 四、总结建议

  • 按 Unicode 范围映射字体,不用死记语言
  • 给常见文字系统配对应字体(如 CJK、Cyrillic、Latin-Extended)
  • 使用 Noto 字体家族作为 fallback,效果统一,覆盖面广
  • 提前扫描字体的支持范围,动态判断字体是否能绘制某个字符

如果你希望我帮你写一个完整的「多字体混排渲染方案」的封装,也可以继续问我,我们可以用 opentype.js 封装一个智能的渲染器 🔧。

有没有哪个部分你还想深入了解?比如字体 fallback 的具体实现?还是想看看如何自动判断某个字体能不能显示某个字符?我可以给你写工具函数 👍

答案2

这是个很棒的问题!要理解“Unicode 范围”,我们需要从字符编码和字体的本质谈起。下面我会从 字符、Unicode、Unicode Block(范围)、字体 的关系入手,带你一步步梳理清楚这个概念。


🧱 一、字符是啥?

“字符”就是你能看到、输入、打印的那些东西: A, , Ω, é, , 𠮷, 😀

每个字符在计算机中都有一个数字编码 —— 就是 Unicode 编码


🔢 二、什么是 Unicode?

Unicode 是一个全球统一的字符编码标准,为每个字符分配一个独一无二的编号(叫 code point)。

比如:

字符

Unicode 编码(十进制)

十六进制

A

65

0x0041

20320

0x4F60

é

233

0x00E9

Я

1071

0x042F

😀

128512

0x1F600


🧩 三、什么是 Unicode 范围(Block)?

为了管理这么多字符,Unicode 把字符按用途或语言进行分组,称为Unicode Block(字符块、范围)。

举例:

范围名称

编码范围(十六进制)

用途

Basic Latin

0000–007F

英文、数字、标点

Latin-1 Supplement

0080–00FF

西欧语种的扩展字符(é ñ ç 等)

Cyrillic

0400–04FF

俄语等斯拉夫语

Arabic

0600–06FF

阿拉伯语

CJK Unified Ideographs

4E00–9FFF

中文、日文汉字、韩文汉字

Emoji

1F600–1F64F

表情符号

完整列表可以参考: 🔗 https://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt


🧵 四、字体和字符的关系?

字体是字符形状的集合,每种字体内部包含一部分字符的形状(glyph)。

📌 关键点:
  • 字体 ≠ 包含所有字符
  • 比如 Arial 不包含中文,微软雅黑不包含俄语
  • 所以我们才需要“字体 fallback”(备用字体)

🧰 五、所以你需要理解的是:

  1. 字符有 Unicode 编码
  2. 字符的 Unicode 编码属于某个“Unicode Block”(字符范围)
  3. 字体覆盖某些 Unicode Block
  4. 你可以根据字符的编码,来判断需要使用哪个字体

✅ 实用场景例子:

你想渲染一个字符串 "Hello 世界 😀"

  • H, e, l, o 属于 Basic Latin,用 Roboto
  • 世, 界 属于 CJK Unified Ideographs,用 Noto Sans SC
  • 😀 属于 Emoticons,用 Noto Emoji

❓你可能还想问:

Q: 总共有多少个 Unicode Block?

截至 Unicode 15.1,大约有 330+ 个 Unicode 块。每个块覆盖一类字符,具体数量会随着版本更新不断增加。

你可以查看官方完整列表: 🔗 https://unicode.org/charts/


✨ 总结一张图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
字符 (char)
  └─ 编码(Unicode code point)→ 属于某个 Unicode Block
        └─ 某些字体覆盖这个 Block
              └─ 渲染时判断用哪个字体 fallback

如果你想要,我可以为你写一个 Unicode Block 检测器,输入一个字符就能告诉你它属于哪个范围,用来动态选字体。要不要来一个?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
字符编码技术专题(五):前端必读的计算机字符编码知识入门
以上这些问题都涉及到计算机中*础的知识点——字符集及字符编码的概念,本篇将从前端开发人员的视解,让你彻底搞清并理解这些问题的本质。
JackJiang
2023/09/28
4300
字符编码技术专题(五):前端必读的计算机字符编码知识入门
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)
例如其中字母a的二进制位:1100 001 = 97,那么a在计算机中就可以用1100001来保存。
mingjie
2023/04/27
1.7K0
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)
中文字符与中文标点符号判断
Java Character 实现Unicode字符集介绍 CJK中文字符和中文标点判断
BUG弄潮儿
2021/06/25
3.3K0
中文字符与中文标点符号判断
【拓展】谈谈字符编码:Unicode编码与emoji表情编码
码位(码点),对应编码术语中英文中的code point,指的是一个编码标准中为某个字符设定的数值,具有唯一性与一一对应性。码位只规定了一个字符对应的数值,并没有规定这个数值如何存储,视编码方案不同有不同的存储方式。
pingan8787
2020/08/17
8.9K0
MySQL字符编码指南--基础篇
要了解MySQL的字符编码,解决乱码问题,必须先了解字符编码。我们知道所谓信息,在计算机中不过是一串的位(bit:0 or 1),每8个bit组成了一个字节,而这些字节到底表示什么,取决于读到这些对象的上下文,1个字节序列,可以表示整数,字符串或者机器指令,当然也可以表示中文,日文,甚至上古文字。
DBA成江东
2023/07/15
8940
MySQL字符编码指南--基础篇
刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK
英文字母再加一些其他标点字符之类的也不会超过256个,用一个字节来表示一个字符就足够了(2^8 = 256)。但其他一些文字不止这么多字符,比如中文中的汉字就多达10多万个,一个字节只能表示256个字符,肯定是不够的,因此只能使用多个字节来表示一个字符。
笨笨阿林
2022/05/09
4.4K0
刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK
精述字符编码
带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK,GB18030,BIG5,BMP,Code Page,BOM,MBCS,Little Endian,Big Endian,内码,外码。
恋喵大鲤鱼
2018/08/03
1.6K0
精述字符编码
计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题
做通信的时候,或者使用IO流读写数据的时候脑袋总是晕晕乎乎的。 与计算机打交道久了,不可避免会看到“鬼画符”式的乱码,让人云里雾里的,特别烦人。
烟雨平生
2023/10/20
6K0
计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题
刨根究底字符编码之八——Unicode编码方案概述
前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案。这样一来同一个二进制编码就有可能被解释成不同的字符,导致不同的字符集在交换数据时带来极大的不便。
笨笨阿林
2022/05/09
9470
刨根究底字符编码之八——Unicode编码方案概述
正则表达式 - 匹配 Unicode 和其他字符
      有时我们需要匹配 ASCII 范围之外的字符。现在已经有了可以表示超过10万个字符的Unicode 标准(http://www.unicode.org)。然而,Unicode 也没有完全舍
用户1148526
2023/05/11
3.1K0
正则表达式 - 匹配 Unicode 和其他字符
基础知识:字符编码
1、什么实字符编码:将人识别的字符转换成计算机能识别的01,而转换的过程或者规则就是字符编码表。
py3study
2020/01/17
5280
干货 | iOS 程序员眼中的 Emoji
一、Emoji 简介 绘文字(日语:絵文字/えもじ emoji)是日本在无线通信中所使用的视觉情感符号,绘指图画,文字指的则是字符,可用来代表多种表情,如笑脸表示笑、蛋糕表示食物等。在中国大陆,emoji通常叫做“小黄脸”,或者直称emoji 在NTTDoCoMo的i-mode系统电话系统中,绘文字的尺寸是12x12 像素,在传送时,一个图形有2个字节。Unicode编码为E63E到E757,而在Shift-JIS编码则是从F89F到F9FC。基本的绘文字共有176个符号,在C-HTML4.0
腾讯NEXT学位
2020/01/08
1.7K0
干货 | iOS 程序员眼中的 Emoji
Java实现过滤中文乱码
Unicode编码是一种涵盖了世界上所有语言、标点等字符的编码方式,简单一点说,就是一种通用的世界码;其编码范围:U+0000 .. U+10FFFF。按Unicode硬编码的区间进行划分,Unicode编码被分成若干个block ( Unicode block);每一个Unicode编码专属于唯一的Unicode block,Unicode block之间互不重叠。从码字的本身的属性出发,Unicode编码被分成了若干script ( Unicode script);比如,与中文相关的字符、标点的scriptHan包括block如下:
Spark学习技巧
2020/12/28
1.7K0
从JavaScript看字符编码的前世今生!
导语 | 每个程序员都应该了解一下字符编码,有了基础概念之后我们对编程语言、字符处理能有更深入的理解。本文我花了大量时间进行资料查阅和考证,希望能够给大家带来一些帮助,多多交流! 一、起因 最近在研究Babel的源码,在看到Acorn词法解析源码中有这样一段逻辑: pp.fullCharCodeAtPos = function() { let code = this.input.charCodeAt(this.pos) if (code <= 0xd7ff || code >= 0xdc00
腾讯云开发者
2022/05/18
8630
从JavaScript看字符编码的前世今生!
大数据必学Java基础(十二):基本数据类型
Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。
Lansonli
2022/07/06
2.4K0
大数据必学Java基础(十二):基本数据类型
字符集和字符编码(Charset & Encoding)
计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如’a’用什么表示,称为”编码”;反之,将存储在计算机中的二进制数解析显示出来,称为”解码”,如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致’a’解析成’b’或者乱码。
空空云
2018/09/27
1.9K0
字符集和字符编码(Charset & Encoding)
一文解开java中字符串编码的小秘密
在本文中你将了解到Unicode和UTF-8,UTF-16,UTF-32的关系,同时你还会了解变种UTF-8,并且探讨一下UTF-8和变种UTF-8在java中的应用。
程序那些事
2020/09/22
6450
那些坑人的乱码问题(中)
上篇中已经讲了编码的基本概念,本来是直接写MySQL的编码问题的,但是觉的Unicode字符集和UTF编码太重要了,以至于不能忽略这部分内容。
一个无聊的人
2022/08/26
6990
那些坑人的乱码问题(中)
字符编码
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://polaris.blog.51cto.com/1146394/377468
拾点阳光
2018/09/28
2.2K0
你所不了解的字符编码
前言 在我的工作中,常常会遇到形形色色的字符编码,对于各种编码技术本人了解的也不是很多。 本篇是我了解编码系列的开篇,主要内容讲述字符编码的基本概念,然后介绍一下常见的字符编码,最后说明一下 Java
BUG弄潮儿
2021/06/25
1.1K0
你所不了解的字符编码
相关推荐
字符编码技术专题(五):前端必读的计算机字符编码知识入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档