返回顶部
首页 > 资讯 > 精选 >Swift中一个字符引发的Crash实例分析
  • 553
分享到

Swift中一个字符引发的Crash实例分析

2023-06-29 06:06:36 553人浏览 独家记忆
摘要

这篇文章主要介绍“Swift中一个字符引发的Crash实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Swift中一个字符引发的Crash实例分析”文章能帮助大家解决问题。最近因为一个字符引发

这篇文章主要介绍“Swift中一个字符引发的Crash实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Swift中一个字符引发的Crash实例分析”文章能帮助大家解决问题。

最近因为一个字符引发了 Crash,因为实际的业务场景不便描述,这里便用一段测试代码作说明。

话不多说,直接上代码:

let testCharacters: Set<Character> = ["!", "\"", "$", "%", "&", "'", "+", ",", "<", "=", ">", "@", "[", "]", "`", "{", "}"]let testString = "@`Hello World`!"var result: UInt8 = 0for character in testString {    if testCharacters.contains(character) {result += character.asciiValue!    }}

上面的代码做的事情是:取出 testString 里特定字符的 ASCII 码,然后相加。

我们来 Review 下这段代码,有经验的同学应该立马嗅到了代码里的坏味道:character.asciiValue! 这里用了强解。

那这里的强解用得合理吗?因为定义在 testCharacters 里的字符肯定都有对应的 ASCII 码,咋一看这里用强解也没关系。

但是,如果我们实际跑一下,就会出现因为 asciiValue 为 nil 的强解 Crash 了。这是为什么呢?

关键在于 testString 里面包含了 全角字符。testString 里的后一个 ` 是一个全角字符,它是没有 asciiValue 的。

我们可以在 Swift Playgrounds 里执行下面的代码得到答案:

let halfWidth = "`"halfWidth.lengthOfBytes(using: .utf8) // 1halfWidth.first!.isASCII // truehalfWidth.first!.asciiValue // 96let fullWidth = "`"fullWidth.lengthOfBytes(using: .utf8) // 3fullWidth.first!.isASCII // falsefullWidth.first!.asciiValue // nil// Character 实现 Equatable 协议,判断出两个值是相等的。halfWidth == fullWidth // true

从上面代码执行结果可以看到,halfWidth 这个半角字符占一个字节长度,对应的 ASCII 码为 96 而全角字符 fullWidth 占三个字节长度,其 asciiValue 为空的。

Swift 数组的 contains 方法利用的是 Equatable 协议 , 从上面代码里 halfWidth == fullWidth 的结果为 true 来看,Character 实现的 Equatable 协议并没有考虑字符全角/半角的情况。

用肉眼看,完全看不出字符有何不同,而 contains 方法结果为 true 也影响了我们的判断,以为这个强解是 OK 的,稍不注意就导致了 Crash。

最后,从维基百科上整理了关于全角/半角的历史知识:

在早期的计算机中,英语或拉丁字母语言使用的系统,每一个字母或符号,都是使用一字节的空间(一字节由 8 比特组成,共256个编码空间)来储存;而汉语、日语及韩语文字,由于数量大大超过256个,故惯常使用两字节来储存一个字符。所以这原本是编码层面的“单字节”“双字节”的问题。

当时的电脑使用等宽字体(如DOS、部分文字编辑器等)时,字体也就顺应这种编码形式,将中日韩文字的宽度绘制成拉丁字母和数字的两倍,这样字符的编码存储和显示宽度可以一一对应起来:

  • 单字节文字 显示成 半宽,

  • 双字节文字 显示成 全宽。

因此当时的用户就开始习惯称中、日、韩等文字为 全角字符,而称拉丁字母或数字为 半角字符。

但是,后来计算机的文字编码技术已经发生很大变化,存储一个字符可能用一个、两个、四个或者更多的字节。一个英文字符即使显示为半宽,依照不同的编码方式,并不一定是用一个字节存储。

因此,现在字符编码存储和字符显示宽度的已经没有一一对应关系。

但是由于字符编码和字形宽度曾经的对应关系,很多用户一直习惯性地使用"全角/半角"词汇。

因此现在的 全角字 可能是指:

  • 用两个字节存储的字符

  • ASCII(所谓半角英文和数字)以外所有的字符

  • 显示上字身宽度为一比一正方形的字形。

关于“Swift中一个字符引发的Crash实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Swift中一个字符引发的Crash实例分析

本文链接: https://lsjlt.com/news/323143.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Swift中一个字符引发的Crash实例分析
    这篇文章主要介绍“Swift中一个字符引发的Crash实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Swift中一个字符引发的Crash实例分析”文章能帮助大家解决问题。最近因为一个字符引发...
    99+
    2023-06-29
  • Swift踩坑实战之一个字符引发的Crash
    最近因为一个字符引发了 Crash,因为实际的业务场景不便描述,这里便用一段测试代码作说明。 话不多说,直接上代码: let testCharacters: Set<Chara...
    99+
    2024-04-02
  • Python字符串的索引与切片实例分析
    这篇“Python字符串的索引与切片实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python字符串的索引与切片实例...
    99+
    2023-06-29
  • Go中的字符串应用实例分析
    这篇“Go中的字符串应用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go中的字符串应用实例分析”文章吧。字符串的本...
    99+
    2023-06-30
  • python中字符串使用实例分析
    这篇“python中字符串使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python中字符串使用实例分析”文章吧...
    99+
    2023-07-02
  • Python中的字符串相似度实例分析
    本文小编为大家详细介绍“Python中的字符串相似度实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中的字符串相似度实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Python字符串相似...
    99+
    2023-06-30
  • PHP中字符串的示例分析
    小编给大家分享一下PHP中字符串的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前面几篇文章中,我们也有提到有关于PHP的字符串等相关问题,那么几天我们继...
    99+
    2023-06-15
  • Java中string类型的xml字符串实例分析
    这篇“Java中string类型的xml字符串实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中string类...
    99+
    2023-06-29
  • java中的char占几个字节实例分析
    java中的char占几个字节实例分析       1:“字节”是byte,“位”是bit ;  2: 1 byte = 8 bit ;  char 在Java中是2个字节。jav...
    99+
    2023-05-31
    java char 字节
  • java IO中字节和字符的示例分析
    这篇文章给大家分享的是有关java IO中字节和字符的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列...
    99+
    2023-06-14
  • php中包含字符的示例分析
    这篇文章将为大家详细讲解有关php中包含字符的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Pre...
    99+
    2023-06-14
  • Python中拆分具有多个分隔符的字符串方法实例
    目录使用方括号 [] 根据多个定界符拆分字符串处理前导或尾随定界符使用 str.replace() 拆分具有多个定界符的字符串使用可重用函数根据多个定界符拆分字符串使用 re.fin...
    99+
    2023-05-18
    python按分隔符进行分割 python多个分隔符 Python拆分字符串
  • JAVA中IO操作的字节流和字符流实例分析
    这篇文章主要介绍了JAVA中IO操作的字节流和字符流实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JAVA中IO操作的字节流和字符流实例分析文章都会有所收获,下面我们一起来看看吧。IO操作字节流java...
    99+
    2023-06-29
  • INSERT语句引发的死锁实例分析
    这篇文章主要介绍“INSERT语句引发的死锁实例分析”,在日常操作中,相信很多人在INSERT语句引发的死锁实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”INSERT...
    99+
    2024-04-02
  • HTML中头部元素、字符实体的示例分析
    这篇文章将为大家详细讲解有关HTML中头部元素、字符实体的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。   <head> 元素是所有头部元素的容器...
    99+
    2024-04-02
  • SQL中字符串拼接的示例分析
    这篇文章主要为大家展示了“SQL中字符串拼接的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL中字符串拼接的示例分析”这篇文章吧。一、概述相信大家在...
    99+
    2024-04-02
  • ES6中模板字符串的示例分析
    这篇文章主要为大家展示了“ES6中模板字符串的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中模板字符串的示例分析”这篇文章吧。模板字符串(tem...
    99+
    2024-04-02
  • python中lstrip()截掉字符的示例分析
    这篇文章主要介绍python中lstrip()截掉字符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、说明lstrip() 方法用于截掉字符串左边的空格或指定的字符。2、语法str.lstrip([cha...
    99+
    2023-06-15
  • C语言中输入中文字符串实例分析
    本文小编为大家详细介绍“C语言中输入中文字符串实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中输入中文字符串实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • MySQL给字符串加一个高效索引的实现
    目录需求前缀索引倒序+前缀索引总结需求 在日常需求中,用户使用手机号或者邮箱登录某一个系统,是一个很常见的操作,那如何在类似手机号或者邮箱这样的字段上建立一个合理的索引呢? 前缀索引 前缀索引,就是以一个字段值的一部分作...
    99+
    2023-03-20
    MySQL字符串高效索引 MySQL字符串索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作