“Natural Earth II“ === “Natural Earth II“是false?你知道空 格的四种写法吗?

news2024/9/25 11:20:34

前言

有一回对我说道,“你学过前端么?”我略略点一点头。他说,“学过前端?……我便考你一考。html 里面的空格,怎样 coding 的?”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会。孔乙己等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些 code 应该记着。将来做 leader 的时候,coding 要用。”我暗想我和 leader 的等级还很远呢,而且我们 leader 也从不 coding;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是&后面坠一串 nbsp;么?”孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说,“对呀对呀!……空格有四样写法,你知道么?”

天下何人不孔乙己!() 不开玩笑啦!接下来来细究一下这个空格的的四种写法,实际上是六种编码方式,后面会用代码来验证。

问题来源

在编写关于 Cesium 的代码的时候,我想用 filter 过滤使用提供的默认选择地图,然后使用名字来作为条件,然后就有了如下图所示的问题,主要还是太相信自己的眼睛了,这个问题和写什么代码没有太大关系,主要是对于 utf8 字符集编码中空格区别的认识。

question

上图中把控制台输出的两个字符串复制,在 Chrome 浏览器的控制台中做比较会发现,他们两个不相等,虽然看起来一毛一样。

下面是遇到问题的源代码,由于是自己的 http 服务,所以大家可能要自己引入 CDN 或者别的方法配置一下,这里不做赘述了。

<html>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>rollup-test</title>
    <style>
      html,
      body,
      #cesiumContainer {
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
        overflow: hidden;
      }
      .cesium-viewer-bottom {
        display: none !important;
      }
    </style>
    <!-- 样式文件链入 -->
    <link href="./cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet" />
  </head>

  <body>
    <div id="cesiumContainer"></div>
    <!-- 测试脚本 -->
    <script type="module">
      import * as Cesium from "./cesium/Build/Cesium/index.js";

      window.CESIUM_BASE_URL = "./cesium/Build/Cesium";
      const viewer = new Cesium.Viewer("cesiumContainer");
      const viewModel = viewer.baseLayerPicker.viewModel;
      viewModel.selectedImagery = viewModel.imageryProviderViewModels.filter(
        ({ name }) => name === "Natural Earth II"
      )[0];

      const i =
        viewModel.imageryProviderViewModels[
          viewModel.imageryProviderViewModels.length - 1
        ];
      console.log(`${i.name}\nNatural Earth II`);
      console.log(i.name === "Natural Earth II");
    </script>
  </body>
</html>

如何解决?为什么?

其实一开始我还是找了老半天问题,如果不是 VsCode 我可能还需要再找半天才能知道,我把两个字符串都复制到 VsCode 中发现 VsCode 有提示(如下图提示),正常敲的空格没啥问题,但是这种格式的空格,查了一下才知道,原来是一种特有的空格编码,其作用是为了防止空格两边的单词换行,只能说 Cesium 源码的库实在是太细致了,这一点都做了优化,可以看到 Natural 和 Earth 之间是正常的空格,但是 Earth 和 II 直接为了防止换行,所以使用了非断行空格,目的就是为了保证让 Earth 字符和 II 字符在一行内显示,依据查到的资料显示,这种空格输入方式是按住alt然后数字键盘输入1060再松开 alt 键(即alt+1060),还可以用到系统文件名中,只不过不建议这样尝试,因为可能会遇到许多问题。

answer

知道问题的来源之后,就可以解决"Natural Earth II" === "Natural Earth II"为什么等于false的问题了,这段字符串中前面是用了alt+1060,而后面是键入空格,所以只要保持两边空格字符编码一致就可以了。请不要直接复制这串等式到控制台验证,下面有解释原因。

解决这个问题后,就赶紧修复了代码问题,但是回头仔细想想,Cesium 开发人员应该不能用alt+1060这种方式输入空格吧,这不合理,然后打开调试窗口查看了一下该出字符的原文(如下图所示),在 Cesium 源代码里面也是&nbsp;,这不就是刚开始学前端的时候 html 对特殊字符的处理吗,就是把关键的字符都做了转义,除了空格,还有许多特殊字符,比如左右尖括号,这里就不过多赘述了,这是前端开发者的基本知识。

cesium

往后面再延伸一步,为啥&nbsp;和我直接敲的空格不一样?我又编写 html 把&nbsp;输出到页面,发现在网页中展示的空格和我手敲的是一个字符,但是在 js 代码里面输出到控制台的又不一样。所以同样的&nbsp;如果在浏览器页面内复制是和键入的空格一样的字符,但是直接获取到 Elemnt 中的 innerText 用 js 输出这种空格,则编码格式和键入的空格不同;在这基础上我又查了一下 utf8 里面到底有多少种空格编码。最后用代码做了验证,如下文所示。

代码验证

将下面这段代码,复制到浏览器控制台直接回车,可以看到后面附上的结果图片,这里只验证了 js;如果&nbsp;直接输出到页面再复制对比,实际上和键入的空格是一致的,这个可自行验证尝试。

function charToUtf8(text) {
  return text.charCodeAt(0).toString(16);
}

// &nbsp;   /*非断行空格*/ 键入方式:alt+0160
// &ensp;   /*半角空格*/
// &emsp;   /*全角空格*/
// &thinsp; /*窄空格*/
// &zwnj;   /*零宽不连字空格*/
// &zwj;    /*零宽连字空格*/
const spaceList = {
  输入空格: " ",
  非断行空格: "&nbsp;",
  半角空格: "&ensp;",
  全角空格: "&emsp;",
  窄空格: "&thinsp;",
  零宽不连字空格: "&zwnj;",
  零宽连字空格: "&zwj;"
};
for (let [key, val] of Object.entries(spaceList)) {
  const myDiv = document.createElement("div");
  myDiv.innerHTML = val;
  console.log(key, `'${myDiv.innerText}'`, myDiv, charToUtf8(myDiv.innerText));
}

上述代码运行结果(空格类型+输出+元素+utf8 编码):
check

有什么实际意义?

如果非要说有什么意义的话,那就是没有意义,对于写代码来说其实很少会遇到这种问题;唯一的作用就是遇到像我这样的问题至少能知道为啥,如果不搞清楚就很难知道问题的根本原因,所以多少还是可以了解一下;当然在实际的应用中,对于一些排版文字,对这些编码是有明确要求的,空格输入的这几种方式参考了这篇文章——空格的 6 种 Html 书写形式。

如果本篇文章对您有帮助欢迎点赞、收藏、转发,非常感谢您的支持(~ ̄ ▽  ̄)~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络 - 网络中的基本概念

前言 本篇介绍网络的一些基本概念&#xff0c;认识IP地址&#xff0c;端口号&#xff0c;协议&#xff1b;了解常用的网络协议模型&#xff0c;知道数据如何封装与分用的&#xff1b;为以后学习计算机网络其它知识做铺垫&#xff0c;如有错误&#xff0c;请在评论区指正&#…

Java数据结构 二叉树基本知识 二叉树遍历

二叉树很简单的&#xff0c;试试呗~ 文章目录 Java数据结构 & 二叉树基本知识 & 二叉树遍历1. 树的基本定义2. 树的基本概念2.1 例子2.2 树的代码表示&#xff1a; 3. 二叉树3.1 特殊节点3.2 特殊的二叉树3.3 二叉树的性质3.3.1 证明第三点3.3.2 证明第四点 4. 二叉树遍…

MySQL-MHA高可用(一)

目录 &#x1f341;同步概念 &#x1f341;工作原理 &#x1f343;环境拓扑 &#x1f341;环境准备 &#x1f342;manager &#x1f342;master1 &#x1f342;master2 &#x1f342;slave &#x1f343;配置半同步复制 &#x1f341;master1 &#x1f341;master2 &#x1f34…

函数 tcgetpgrp tcsetpgrp 和 tcgetsid

① tcgetpgrp & tcsetpgrp 函数 tcgetpgrp函数是用来获取前台进程组的ID #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> int main() {printf("我的ID&#xff1a;%d---我…

【MySQL学习】MySQL库的操作

目录一、查看数据库的连接二、数据库的创建三、字符集和校验规则3.1 查看数据库默认的字符集以及校验规则3.2 查看数据库支持的字符集以及校验规则3.3 校验规则对数据库的影响四、操纵数据库4.1 查看数据库4.2 显示创建语句4.3 修改数据库4.4 数据库的删除五、数据库的备份与恢…

Nginx中的location规则与rewrite

nginx正则表达式 ^$空行 \d数字 \D代表非数字 \s 匹配空白符 \S 非空白字符 \w匹配任意单词符包括下划线[A-Za-z0-9_] {n} 匹配起那面字符n次 .* 除换行符\n匹配任意字符多次 {n,m}匹配前面字符5到10次 [abc] 匹配一次a,b,c ( )表达式的开始和结束 | 或运算符 &#…

【uniapp】sigmob广告加载失败:-5005、500422没有imei的解决办法(原创可用)

问题 最近打算将开发的uniapp应用对接uni-ad广告中去&#xff0c;在对接sigmob的时候出现了以下问题&#xff1a;①错误码-5005&#xff0c;查询了以下官方文档&#xff0c;发现是说我频繁调用&#xff0c;可是并没有&#xff0c;我是在真机上测试的没成功就没在弄了&#xff…

【力扣-876】链表的中间结点

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : ----------小Tips&#xff1a; 虽然都是口服液体制剂&#xff0c;且看起来单支容量都一样&#xff0c;但是“藿香正气水”与“藿香正气口服液”的区别你知道吗&#xff1f;藿香正气水里含有…

Vue电商项目实战之角色列表添加,编辑,删除功能

这是黑马vue电商项目后台,自己需要完成的功能,这里仅供参考当然还需要自己去理解. 一.添加功能 在roles.vue中 1.添加角色的对话框 代码如下: <!-- 添加角色的对话框 --><el-dialog :visible.sync"addRoleDialogVisible" title"添加角色" widt…

【C++技能树】原来比C方便这么多 --缺省参数、函数重载、引用讲解

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

DPCNN分类模型

论文 Deep Pyramid Convolutional Neural Networks for Text Categorization 提出深层金字塔卷积网&#xff08;DPCNN&#xff09;是 word-level 的广泛有效的深层文本分类卷积神经网络&#xff0c;比 TextCNN&#xff08;浅层CNN&#xff09;性能明显提高。 TextCNN 不能通过卷…

Unity InputSystem (一)

什么是InputSystem InputSystem 是 2019 年 Unity 新推出的插件&#xff0c;输入系统包实现了一个系统来使用任何类型的输入设备来控制你的 Unity 内容。它旨在成为 Unity 的经典输入管理器更强大、更灵活、更可配置的替代品。 新输入系统基于事件&#xff0c;输入设备和动作逻…

Redis 哨兵和集群

文章目录1. 单机模式2. 主从架构3. 哨兵4. 集群模式5. 哈希槽是什么&#xff1f;1. 单机模式 Redis 单副本&#xff0c;采用单个 Redis 节点部署架构&#xff0c;没有备用节点实时同步数据&#xff0c;不提供数据持久化和备份策略&#xff0c;适用于数据可靠性要求不高的纯缓存…

【硬件外设使用】——SPI

【硬件外设使用】——SPI SPI基本概念SPI通信协议SPI使用方法pyb.spimachine.spi SPI可用的传感器 SPI基本概念 SPI是一种串行端口通信接口&#xff0c;它是一种同步的全双工协议&#xff0c;用于在数字电路之间传输数据。SPI代表串行外设接口&#xff0c;是一种非常流行的数字…

UDS诊断测试

UDS&#xff08;Unified Diagnostic Services&#xff0c;统一的诊断服务&#xff09;诊断协议是在汽车电子ECU环境下的一种诊断通信协议。这种通信协议被用在几乎所有由OEM一级供应商所制造的新ECU上面。这些ECU控制车辆的各种功能&#xff0c;包括电控燃油喷射系统&#xff0…

TI在物联网和AI边缘计算中落伍了吗?

摘要&#xff1a;本文介绍一下TI在边缘计算工作中所做的努力。 发明“人工智能”这个term的老头儿也不会想到人工智能在中国有多火。 不管是懂还是不懂&#xff0c;啥东西披上“人工智能“的面纱都能瞬间成为大项目。 学习AI 的年轻人认识NVIDIA&#xff0c;可能不太知道DSP是…

金毅:10x HTAP,企业级关系型数据库内核技术创新与演进

导语4月8日下午&#xff0c;为期两天的第十二届数据技术嘉年华&#xff08;DTC 2023&#xff09;在北京新云南皇冠假日酒店圆满落下帷幕。大会以“开源融合数字化——引领数据技术发展&#xff0c;释放数据要素价值”为主题&#xff0c;汇聚产学研各界精英到场交流。作为大会的…

网络原理之UDP

hi,大家好,又见面了,今天为大家介绍一下UDP的网络原理&#x1f437;&#x1f437;&#x1f437; 文章目录认识UDP报文格式UDP特点TCP,UDP应用场景基于UDP的应用层协议认识UDP报文格式 UDP特点 TCP,UDP应用场景 基于UDP的应用层协议 1.认识UDP报文格式 其实在真正传输的…

批量记录收支明细:手把手教你如何查看上个月的收支明细并打印。

记录收支明细太久&#xff0c;想要快速查看并筛选出上个月的某一个明细要如何进行查询&#xff0c;还要进行打印要如何操作&#xff1f;今天就由小编来教教大家要如何操作。 首先第一步&#xff0c;我们要进入晨曦记账本主页面&#xff0c;点击主页面上方功能栏里的“添加收支…

聚焦云原生安全|安全狗云甲荣膺CSA 2022安全金盾奖

4月13日&#xff0c;第六届云安全联盟大中华区大会“年度颁奖典礼”表彰仪式顺利开展。作为国内云原生安全领导厂商&#xff0c;安全狗也收到邀请出席此次活动。​ 此次活动上&#xff0c;“年度颁奖典礼”作为重要环节之一&#xff0c;获得业界的关注。安全狗旗下云原生安全产…