我一直觉得Unicode 对照表这种内容属于“平时没人提遇到问题全网找不到”的典型。这个系列写到“045_Unicode对照表十一”后台收到的搜索关键词越来越多尤其是最近一批热搜里反复出现“unicode的韩文字符可复制写出来”“unicode字符大全可复制”“arial unicode ms”这些词。很多人不是不知道 Unicode 这个概念而是急需一张能直接复制、能查到码位、能解决显示乱码的对照表。这篇文章就把这段时间被问得最多的问题集中整理一遍重点放在韩文音节、高频符号、字体渲染和工程代码里的实际用法上。系列前面十期分别覆盖了 ASCII、拉丁扩充、CJK 基本区、标点符号、带圈数字、全角半角、数学符号、箭头、货币符号、拼音注音等内容。这一期之所以专门挑韩文和“可复制”这个需求来讲是因为后台留言里出现了大量类似“我要在文档里写韩文但输入法打不出来”“从网页复制的韩文粘贴后是问号”“Unicode 字符大全里能找到字但复制到工程代码里就乱码”的求助。这些问题的根子其实都指向同一个地方你把字符放进文件之前有没有想过它到底对应的是哪一个码点。1. 为什么这个系列写到 045 还要继续讲对照表先说一个听起来有点反常识的结论Unicode 对照表到今天依然是刚需而且需求比十年前更旺盛。原因不是大家不会用输入法而是“跨系统、跨软件、跨字体”的场景越来越多。同一个字符在 Windows 记事本里正常粘贴到 Linux 终端变乱码在 Chrome 里正常放进老旧的财务系统导出 Excel 后直接变成问号。这时候你唯一能依靠的就是一张准确的码位对照表。1.1 热搜词背后藏着三种完全不同的需求我把最近这批热搜词拆开看了一下基本能分成三类。第一类是“我要找某个字符”比如“笑哭的unicode”“unicode字符大全可复制”这种需求最普遍本质上是输入法覆盖不到的符号需要靠复制或者码点来插入。第二类是“我要显示正常”比如“arial unicode ms”“unicode字符显示器”这类问题多数出在字体缺字形而不是 Unicode 本身出了问题。第三类是“我要在不同系统之间转换数据”比如“abap unicode解码”“unicode的韩文字符可复制写出来”这就涉及到编码转换和码点换算。这三类需求指向的是完全不同的能力。第一类只需要会查表第二类需要懂一点字体渲染第三类需要了解编码原理和编程接口。很多人搜“unicode对照表”其实是想一步到位解决所有问题但现实是没有一张表能同时满足这三种场景。所以我这一期的做法是先给可直接复用的对照表再讲怎么判断一个字符是否能在你的环境里正常显示最后给代码层面的处理方案。1.2 “对照表”这个词本身就很误导人还有一点必须提醒网上搜“对照表”会同时出现“ascii码对照表”“电阻阻值对照表”“pcb线宽电流对照表”“e96贴片电阻对照表”“pt1000分度表对照表”。这些完全是两码事。ASCII 码对照表属于字符编码领域和 Unicode 是一家的但电阻阻值、PCB 线宽、PT1000 分度表属于电子工程领域它们跟 Unicode 没有任何关系。之所以会被一起搜出来纯粹是因为“对照表”这三个字太通用。我见过不少初学者拿着“电阻阻值对照表”去对比字符编码结果自然是牛头不对马嘴。这一期既然标题叫“Unicode 对照表”就把边界说清楚我们只讨论字符、码点和编码之间的对应关系。线径规格、导体电阻这些内容属于另外一个专业方向搜索引擎把它们推荐到一起恰恰说明现代人查资料时“关键词太短”的问题有多普遍。2. 先花三分钟理清字符、码点、编码三者的区别很多人在这一步栽跟头。Unicode 对照表上写着“가 UAC00”但你把这个字符存进文件后再读出来在内存里看到的可能是EAB080三个字节也可能变成AC 00两个字节。为什么同一个字符字节序列还不一样因为 Unicode 是字符集它只规定了“字符 → 码点”的对应关系而 UTF-8、UTF-16 才是编码方案它们规定了“码点 → 字节”的转换规则。2.1 用生活类比解释这三层关系把 Unicode 想象成一本巨大的户口本每个字符都有一个唯一的身份证号这就是码点。比如汉字“中”的身份证号是 U4E2D韩文“가”的身份证号是 UAC00。但身份证号不能直接拿来当名字用你得有一套规则把这个号写到各种表格里。UTF-8 是一套规则它把 U4E2D 写成E4 B8 AD三个字节UTF-16 是另一套规则它把 U4E2D 写成4E 2D两个字节。同一个字符在不同编码方案下字节序列不同但这不影响“中”就是 U4E2D 这个事实。所以当你听到“Unicode 编码”这种说法时其实是不严谨的。准确地说应该是“Unicode 码点”加上“某个编码方案”。查对照表时你看到的是码点做文件传输、数据库存储时你操作的是编码后的字节。2.2 对照表上的 UXXXX 到底怎么读U 后面的十六进制数字就是这个字符的码点。以韩文“한”为例它的码点是 UD55C。在 Python 里可以用ord(한)获得十进制码点再用hex()转成十六进制在 JavaScript 里用한.codePointAt(0).toString(16)也能拿到d55c。反过来想从码点得到字符Python 用chr(0xd55c)JavaScript 用String.fromCodePoint(0xd55c)。理解了这一点你查表时就不会只盯着那个字符长什么样而是会顺手把码点记下来。因为字符形态可能会因为字体不同而变化但码点是永恒不变的。这也是为什么我每期都会在表格里同时列出“字符”和“码点”两列你复制字符是为了用记下码点是为了排查问题。3. 本期重点韩文音节区与高频可复制字符这一期后台搜索量最大的一个具体需求是“unicode的韩文字符可复制写出来。写出20个”。这说明很多人需要在没有韩文输入法的设备上录入韩文或者需要在代码里硬编码韩文字符。韩文在 Unicode 里的位置非常有规律掌握规律后不查表也能推算出来。3.1 韩文音节的编码规律韩文字母谚文在 Unicode 中主要分布在三个区域谚文字母区U1100–U11FF、谚文兼容字母区U3130–U318F、谚文音节区UAC00–UD7A3。日常使用最多的“가나다라마바사”这些完整音节全部落在音节区。音节区的排列遵循“初声 × 中声 × 终声”的规则。每个音节由一个初声、一个中声、一个可选的终声组成。Unicode 把韩文音节按照“가 UAC00”为起点按一定顺序连续排列。这意味着你只需要记住一个起始码点 UAC00再用初声、中声、终声的索引按公式计算就能得到任意韩语音节的码点。这个公式在你的编程环境里没法直接输入韩文输入法时特别有用# 初声19个中声21个终声28个含无终声 # 音节码点 0xAC00 (初声索引 * 21 中声索引) * 28 终声索引 def hangul_syllable(choseong, jungseong, jongseong0): return chr(0xAC00 (choseong * 21 jungseong) * 28 jongseong) # 例가 初声0(ㄱ), 中声0(ㅏ), 无终声 print(hangul_syllable(0, 0)) # 가实际开发中很多韩国本地系统在传输数据时如果编码声明错误韩文就会出现乱码。拿到乱码后的第一步不是猜而是把乱码字符逐个转成码点看看它们落在哪个区块。如果码点全部落在 UAC00–UD7A3 区间内说明数据本身没有问题是显示层的字体或编码声明出了问题如果码点变成了 UC548、UB2F5 这类看似正常但组合起来毫无意义的音节那就要检查是 UTF-8 被按 EUC-KR 解码了还是反过来。3.2 直接可复制的 20 个高频韩文音节对照下面这组字符可以直接复制使用我建议你同时把码点抄进自己的笔记里。它们是韩文里出现频率最高的一批音节覆盖了打招呼、人称、常用动词和格式化文本中最常见的字。字符码点字符码点가UAC00나UB098다UB2E4라UB77C마UB9C8바UBC14사UC0AC아UC544자UC790차UCC28카UCE74타UD0C0파UD30C하UD558한UD55C국UAD6D어UC5B4요UC694있UC788없UC5C6这里多说一句很多网页展示韩文时会出现“字符存在但字形不显示”的情况。你复制下来粘贴到 Word 里正常粘贴到某些老系统里变成方框这不是韩文字符有问题而是字体文件里没有对应的 glyph。解决办法是换用支持韩文的字体比如系统自带的 Malgun Gothic韩文版 Windows 默认、Noto Sans KR或者是热搜里反复出现的 Arial Unicode MS。后面我会专门讲字体这条排查链路。3.3 其他高频可复制符号速查除了韩文这几次热搜里还有几个高频字符值得单独列出来。第一个是“笑哭”表情 U1F602它在主流系统和手机上都显示正常但在一些老旧企业软件里会变成空白方块。第二个是带圈数字 ①–⑳分布在 U2460–U2473Excel 里偶尔会用到。第三个是中文全角空格 U3000很多人排版时为了对齐空格从网页复制一个看起来是空格的东西其实是 U3000 全角空格和普通半角空格 U0020 完全是两个码点。字符名称码点笑哭表情U1F602①带圈数字一U2460⑳带圈数字二十U2473全角空格U3000—破折号U2014…省略号U2026℃摄氏度U2103这些字符单独看没什么但放在“对照表”这个主题下就特别值得记。因为它们的共同特点是字符本身没坏码点也正确但换一个环境就可能出现显示异常。你能做的就是先确认码点再去判断是字体还是编码问题。4. 拿到的码点怎么在工程代码里落地有些读者不是为了在文档里写几个韩文符号而是要在程序里处理用户输入、做数据清洗、拼接接口返回值。这时候“对照表”的用法就变了你不再需要人类可读的表格你需要的是编程语言里的转换函数。我整理了三个最常见的场景。4.1 Python 里的码点转换Python 3 对 Unicode 的支持已经非常成熟。ord()和chr()是最常用的一对双向函数。ord接收一个字符返回码点chr接收十进制码点返回字符。要注意的是对于码点大于 UFFFF 的字符比如表情符号用chr()也可以直接处理不需要额外操作。# 字符 → 码点 print(hex(ord(가))) # 0xac00 print(hex(ord())) # 0x1f602 # 码点 → 字符 print(chr(0xac00)) # 가 print(chr(0x1f602)) # 如果是从 JSON 接口读到\uac00这种转义格式Python 的json.loads()会自动把它转成韩文字符但如果字符串是双反斜杠\\uac00说明前端把这个转义序列又转义了一层你需要先处理成单反斜杠再交给 JSON 解析否则得到的会是字面上的\uac00六个字符。4.2 JavaScript 里容易被忽略的细节JavaScript 的String.fromCharCode()只能处理 U0000 到 UFFFF 范围内的码点处理不了表情这种增补平面字符。如果你用String.fromCharCode(0x1F602)得到的是一个乱码一样的两个字符组合。正确做法是使用 ES6 提供的String.fromCodePoint()它专门用来处理超过 UFFFF 的码点。// 错误写法 console.log(String.fromCharCode(0x1F602)); // 输出乱码 // 正确写法 console.log(String.fromCodePoint(0x1F602)); // // 反向取码点 console.log(.codePointAt(0).toString(16)); // 1f602这个坑我在实际项目里踩过一次。当时是从手机端传表情符号到 Web 端展示后端 Java 用char存储结果表情被切断成两个不可见字符。原因就是 Java 的char是 16 位只能表示 BMP基本多文种平面里的字符而 这类 emoji 位于增补平面必须用代理对表示。最终是用codePointAt配合辅助函数解决的。类似的问题在 ABAP 老系统里更突出后面我会专门提一下。4.3 ABAP 里处理 Unicode 解码的常见姿势热搜里出现了“abap unicode解码”这个词说明确实有 SAP 开发者在查这个问题。ABAP 从 Unicode 系统开始字符串变量内部就是 Unicode 编码不再需要像老系统那样手动转换。但外部接口传进来的字节流仍然需要按正确的编码声明去解析。假设你收到一个字节流已知它来自 UTF-8 编码的韩文但按默认代码页解析后显示成乱码处理思路是先把字节流根据 UTF-8 转成字符串再进行后续逻辑。ABAP 中常用CL_ABAP_CONV_IN_CE这个类来创建转换器指定编码后执行读取。核心代码大致长这样DATA(lo_conv) cl_abap_conv_in_cecreate( encoding UTF-8 input lv_byte_string ). lo_conv-read( IMPORTING data lv_unicode_string ).这段代码的关键在于encoding参数必须和实际编码一致。如果你拿到的是 EUC-KR 流却用 UTF-8 去解解出来的每个字符都会变成替换符 。遇到这种情况先确认源系统的字符集声明再看字节流的高位规律而不是盲目解码。5. 复制粘贴乱码的排查链路从字符到字体“为什么我复制过来的 Unicode 字符变成问号/方块/乱码”是后台提问率最高的问题。这其实不是单一原因造成的我总结了一条排查链路你照着走一遍基本能定位 90% 的显示问题。5.1 第一步判断字符本身是否完整把出问题的字符复制到一个绝对支持 Unicode 的编辑器里比如 VS Code 或者 Notepad然后把光标放在字符旁边看编辑器的状态栏显示的码点。VS Code 的“选择字符后查看状态栏”能直接显示字符的 Unicode 码点。如果编辑器里显示正常说明字符本身没坏问题出在目标软件上如果编辑器里也显示异常说明源数据在复制之前就已经损坏了。源数据损坏常见于“网页显示正常但复制后粘贴内容变了”。原因可能是网页用了 CSS 伪元素、图片字体iconfont或者自定义字体来显示某个图标。比如你用 iconfont 显示一个“购物车”图标页面上看着是个小图标但复制到文本编辑器里得到的可能是空字符或者是某个私人使用区的码点 UE604 之类。私人使用区码点在不同字体下含义完全不同复制出来当然没法用。5.2 第二步检查目标程序是否支持该字符字符本身没问题粘贴到目标程序后出现方块这大概率是字体问题。常见的罪魁祸首就是我前面提到的字体缺字形。比如 Excel 默认字体在某些版本里对“”支持不好Word 里正常粘贴却显示一个空心方块。解决办法有几个一是给目标程序切换支持该字符区块的字体。Arial Unicode MS 是 Google 早期在很多文档里选用的全字集字体覆盖范围很广适合做显示兜底。韩文相关优先选 Malgun Gothic、Noto Sans KRCJK 相关选宋体、微软雅黑、思源黑体表情符号需要 Segoe UI EmojiWindows、Apple Color EmojimacOS。二是对于不支持 emoji 的老系统接受降级显示为黑白符号或方块不要在这个问题上过度纠结。5.3 第三步确认编码转换没有二次破坏还有一种情况是字符本身、字体都没问题但你在传输过程中经历了多次编码转换。比如从数据库取出 UTF-8 字符串写入文件时被系统按 GBK 编码保存再被另一个程序按 UTF-8 读取。这种情况下最终显示的字符串其实是由“错误解码”产生的其他字符组成的通常表现为一串毫无意义的汉字或者中文乱码比如“鐢叉柟”这种。遇到这种问题回溯链条比较麻烦我的建议是尽早统一编码最好不要在链路中出现“先按 A 编码保存再按 B 编码读取”的环节。如果已经出错了可以尝试把当前乱码字符串重新按错误编码编码成字节再按正确编码解码回来。这个操作在 Python 里就是s.encode(gbk).decode(utf-8)之类的反向操作但前提是你知道之前错误地用了哪种编码。6. 顺带排掉几个非 Unicode 领域的“对照表”干扰前面说了现在搜索“对照表”的人可能是在找“0603电阻阻值对照表”或者“pcb线宽电流对照表”。我完全理解这些需求因为我自己以前搞硬件原型的时候也经常查这些表。但我想借这期文章给同时搜到两个领域的读者提个醒不同领域的“对照表”查法、精度、单位体系完全不一样。6.1 电子领域对照表和字符对照表的本质差异电阻阻值对照表查的是 E 系列标准值比如 E96 系列里 10.0、10.2、10.5 这些标称值它对应的是工程上对电阻精度的规整PCB 线宽电流对照表查的是“铜箔厚度 线宽 温升 → 最大电流”的经验关系PT1000 分度表查的是“温度 → 电阻值”的传感器特性。这些表描述的是物理量之间的换算关系而 Unicode 对照表描述的是“人类字符 → 数字码点”之间的约定关系。两者唯一的共同点就是都以“表”的形式出现仅此而已。如果你是因为搜“电阻阻值对照表”误打误撞点进了这篇文章那么我建议你直接忽略字符部分去查 EIA 标准委员会的电子系列阻值表那才是硬件设计的正确依据。同样如果你是来找字符对照表的也不用去研究 E96 贴片电阻是 10.2 还是 10.5那只会让你更头大。搜索时把关键词加长比如“0603 1% 贴片电阻阻值表”或者“unicode 韩文字节 码点表”结果会精确很多。6.2 为什么这个系列本身也像一张“分度表”Unicode 对照表的价值跟 PT1000 分度表其实有异曲同工之处。PT1000 分度表让你在知道电阻值时查温度Unicode 对照表让你在看到一个字符时查码点或者反过来。它们都是“翻译工具”把一种形式的数值翻译成另一种形式。理解了这层类比你就知道为什么这类基础表永远不会过时——工程界永远需要精确的翻译工具。7. 这一期我最想分享的三个实操忠告作为写这个系列的人我实际操作中踩过的坑比查过的表还多最后挑三个最值得说的。第一个忠告别把“复制”当成获取字符的唯一方式。看到“unicode字符大全可复制”这类搜索词我知道很多人就是想在网页上找到字符直接用鼠标复制。这个办法对单字符有效但如果你要批量生成一串韩文或者程序中需要拼接多个特殊字符还是花几分钟学一下chr/fromCodePoint更划算。用代码生成 100 个字符比手动复制 100 次可靠得多。第二个忠告记录字符时养成“字符 码点 编码”三者同时记录的习惯。我以前做数据清洗项目时遇到过一个全角空格问题后来发现数据源头有半角空格、全角空格 U3000、不间断空格 U00A0 三种空格混杂在一起光看显示根本分不出来只能靠码点区分。从那次以后我在所有处理文本的代码里都会把“不可见字符”的码点打印出来做日志。这个习惯救了我无数次。第三个忠告字体选型要提前做不要等出问题再换。如果你写的是面向多个系统分发内容的模板建议默认选用覆盖范围大的字体并且不要直接指定某个第三方字体文件而是用字体回退机制。在 CSS 里就是font-family: Noto Sans KR, Apple SD Gothic Neo, Malgun Gothic, sans-serif;这样一段声明让系统自动在可用字体里找最合适的。最大程度避免“字体缺失造成的方块字”。这个系列做到 045我越来越感觉到Unicode 对照表其实不是一张静态的表而是一种“字符世界的定位思维”。你不需要把几万个码点背下来但你要知道字符为什么会乱、码点怎么查、字体和编码分别影响什么。掌握这套排查链路之后再遇到任何奇怪的字符问题你都比大多数人多走三步。