细说Unicode(三) Unicode 番外之附加字符

2023-05-16

在各种论坛上,经常会看到一些奇怪的字符,它们的内容会超出显示范围,

举个例子:

'Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞'

常见的还有一些有泰文字符组成的。这里就不举例子了。这些看似乱文的字符是怎么形成的呢?

其实它们并不是乱文,尝试输出上面那个例子的字符长度

'Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞'.length; //75

发现竟然包含了75个字符!我们用Array.from输出这些字符:

Array.from('Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞');
//["Z", "͑", "ͫ", "̓", "ͪ", "̂", "ͫ", "̽", "͏", "̴", "̙", "̤", "̞", "͉", "͚", "̯", "̞", "̠", "͍", "A", "ͫ", "͗", "̴", "͢", "̵", "̜", "̰", "͔", "L", "ͨ", "ͧ", "ͩ", "͘", "̠", "G", "̑", "͗", "̎", "̅", "͛", "́", "̴", "̻", "͈", "͍", "͔", "̹", "O", "͂", "̌", "̌", "͘", "̨", "̵", "̹", "̻", "̝", "̳", "!", "̿", "̋", "ͥ", "ͥ", "̂", "ͣ", "̐", "́", "́", "͞", "͜", "͖", "̬", "̰", "̙", "̗"]

再查看其中某个字符的Unicode码点:

Array.from('Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞')[10].codePointAt(0);//793,即16进制的0x0319

根据Unicode映射表查找出0x0319对应的字符,发现U+0300~U+036F称为结合附加符号,那么结合附加符号又是什么?
roadmap.path

附加符号,是添加在字母上面的符号,以更改字母的发音或者以区分拼写相似词语。例如汉语拼音字母“ü”上面的两个小点,或“á”、“à”字母上面的标调符。变音符号可以放在字母的上方或下方,也可以放在其他的位置。当多个附加符号叠加的时候,就形成了看起来像乱码的符号。

而在泰文中,字符的组成也是由一些元音符号和声调符号组成的
roadmap.path

所以多个元音符号或声调符号叠加时也会有类似的效果。这里就不再做阐述。

在网页开发中,特别是评论区,如果遇到太多的"插楼"字符,就会对其他用户造成阅读障碍,影响阅读体验,那怎么避免这种情况呢。这里提供两种方法。

第一种是对字符串文字区域设置最大高度,超出的部分自动隐藏。

p {
    height: 20px;
    overflow: hidden;
}

另一种方式就是对这种特殊字符做过滤操作。将附加字符进行过滤,这种方法在某种程度上会误杀一些需要正常显示的附加符号。但一般也不会影响整体功能,利大于弊。

var regexSymbolWithCombiningMarks = /([\0-\u02FF\u0370-\u1DBF\u1E00-\u20CF\u2100-\uD7FF\uDC00-\uFE1F\uFE30-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF])([\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]+)/g;

function getSymbolsIgnoringCombiningMarks(string) {
    // 删除附加符号:
    var stripped = string.replace(regexSymbolWithCombiningMarks, function($0, symbol, combiningMarks) {
        return symbol;
    });
    
    return stripped;
}

getSymbolsIgnoringCombiningMarks('Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞'); //"ZALGO!"

讲到这里,我们对Unicode已经有了比较细致的了解。相信在开发中碰到问题也能找出根源所在了。

通过学习编码的历史,原理以及查询映射表,我们知道了乱码是怎么产生的,并且利用ES6或正则表达式,来解决绝大多数编码问题。

参考文章:
https://zh.wikipedia.org/wiki
https://mathiasbynens.be/note...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

细说Unicode(三) Unicode 番外之附加字符 的相关文章

  • 深入理解Arrays.sort()

    翻译人员 铁锚 翻译日期 2013年11月16日 原文链接 Deep Understanding of Arrays sort T Comparator lt super T gt c Arrays sort T Comparator lt
  • 18个实时音视频开发中会用到开源项目

    实时音视频的开发学习有很多可以参考的开源项目 一个实时音视频应用共包括几个环节 xff1a 采集 编码 前后处理 传输 解码 缓冲 渲染等很多环节 每一个细分环节 xff0c 还有更细分的技术模块 比如 xff0c 前后处理环节有美颜 滤镜
  • px4 uavcan linux,UAVCAN - UAVCAN Bootloader - 《PX4中文维基》 - 书栈网 · BookStack

    安装UAVCAN启动程序警告 xff1a 无人机控制器局域网络 Unmanned Aerial Vehicle Controller Area Network xff0c UAVCAN 设备通常在出厂时就预安装了启动程序 如果你不对UAVC
  • VISTA -MIT开源基于数据驱动的自动驾驶仿真引擎

    引言 VISTA 是MIT开源的一个基于数据驱动的用于自动驾驶感知和控制的仿真引擎 VISTA API提供了一个接口 xff0c 用于将真实世界的数据集转换为具有dynamic agents sensor suites task objec
  • 计算机管理储存u盘无法使用,解决电脑识别不出U盘的问题

    电脑识别不出U盘怎么样 要解决这个问题 xff0c 首先我们要确定的是U盘在其他电脑上使用正常 xff0c 而且你的电脑USB接口也是一切正常的 xff0c 插入电脑后虽然有反应 xff0c 但就无法正确显示出盘符 xff0c 资源管理器也
  • 介绍:成为一名 Jenkins 贡献者的旅程

    转自Jenkins 中文社区 作为一名软件工程师 xff0c 这些年来在我工作过的不同公司里用到过许多开源软件 xff08 包括框架 库 工具等 xff09 然而 xff0c 在此之前我从没有以一名贡献者的身份参与过开源项目 自从我向 Je
  • 国内嵌入式公司比较排名

    随着 ARM内核的应用越来越广泛 xff0c 从手机到电视机 xff0c 从大型工控设备到小型的家电应用 xff0c 都能找到 ARM内核的嵌入式产品 而由此引领了一番全球嵌入式领域火热的变化 xff0c 当然 xff0c 国内的嵌入式领域
  • MYSQL常用操作及python操作MYSQL常用类

    Mysql 常见操作 数据库操作 创建数据库 create database fuzjtest 删除数据库 drop database fuzjtest 查询数据库 show databases 切换数据库 use databas 1231
  • Windows Server 2008的认证监视工具

    管理证书的一个主要目标是获得企业安全的一种高级水平 应当认真对待身份和访问管理问题 在本文中 xff0c 笔者将简要地讨论认证授权 xff0c 然后探讨使用特定的证书监视工具 xff08 如PKIView msc和certutil exe
  • (转)为什么需要正则表达式 by 王珢

    为什么需要正则表达式 by 王垠 学习Unix最开头 xff0c 大家都学过正则表达式 regexp 可是有没有人考虑过我们为什么需要正则表达式 xff1f 正则表达式本来的初衷是用来从无结构的字符串中提取信息 xff0c 殊不知这正好是U
  • 无法启动程序,因为计算机丢失D3DCOMPILER_47.dll 的解决方法

    这个原因应该是windows update在更新的时出现错误导致的 解决方法是安装 KB4019990 更新包 网址如下 xff1a http www catalog update microsoft com Search aspx q 6
  • KNN cosine 余弦相似度计算

    coding utf 8 import collections import numpy as np import os from sklearn neighbors import NearestNeighbors def cos vect
  • sqlserver2017 重装过程中出现“无法找到数据库引擎启动句柄”错误的解决办法...

    sqlserver数据库引擎修改账号名 xff0c 详情参考 xff1a http blog 51cto com djclouds 2089047 utm source 61 oschina app 在SQL Server安装期间 xff0
  • python基本常用语法&函数&数据结构

    1 Python概述 1989年12月 Google工程师 Guido van Rossum为了打发圣诞节假期 开发了ABC语言的后继 并以他自己喜欢的一个情景剧 Monty Python s Flying Circus命名 Python
  • R语言中对文本数据进行主题模型topicmodeling分析

    主题建模 在文本挖掘中 xff0c 我们经常收集一些文档集合 xff0c 例如博客文章或新闻文章 xff0c 我们希望将其分成自然组 xff0c 以便我们可以分别理解它们 主题建模是对这些文档进行无监督分类的一种方法 xff0c 类似于对数
  • NLTK基础基础教程学习笔记(十四)

    对于文本分类 xff0c 最简单的定义就是基于文本内容来对其进行分类 通常情况算法是根据数字 变量特征来写的 先从https archive ics uci edu ml datasets SMS 43 SPam 43 Collection
  • ***故障错误代码列表

    故障错误代码列表 724 IPX 协议无法在此端口拨出 xff0c 因为此计算机是 IPX 路由器 725 IPX 协议无法在此端口拨入 xff0c 因为未安装 IPX 路由器 726 IPX 协议不能同时在一个以上的端口上用于拨出 727
  • 如何下载网页所有资源(附源码)

    nodejs扒取html页面中所有链接资源 前言 xff1a 总有些人 xff0c 想下载一个插件 xff0c 能直接获取浏览器显示页面的所有资源 也就是下载一个其他人的网站 xff0c 但是不想一个个复制链接的内容 xff0c 原因大致有
  • shiro错误:Subject does not have permission [user:select]

    使用的是jdbcRealm xff0c 在数据库中有相应的权限 错误日志 xff1a org apache shiro authz UnauthorizedException Subject does not have permission
  • Google发布SSLv3漏洞简要分析报告

    摘要 xff1a 今天上午 xff0c Google发布了一份关于SSLv3漏洞的简要分析报告 根据Google的说法 xff0c 该漏洞贯穿于所有的SSLv3版本中 xff0c 利用该漏洞 xff0c 黑客可以通过中间人攻击等类似的方式

随机推荐