成品网站 售卖wordpress ajax本地化

张小明 2026/1/12 21:37:30
成品网站 售卖,wordpress ajax本地化,餐饮网站建设的毕设报告,百度广告代理商查询理解 Go 语言中的字符串、字节与符文 #x1f4d6; 引言 我们之前的博文详细解释了 Go 语言切片的工作原理#xff0c;并辅以大量示例阐明了其实现机制。在此背景下#xff0c;本文将深入探讨 Go 语言中的字符串。乍一看#xff0c;字符串似乎是一个过于简单的话题#…理解 Go 语言中的字符串、字节与符文 引言我们之前的博文详细解释了 Go 语言切片的工作原理并辅以大量示例阐明了其实现机制。在此背景下本文将深入探讨 Go 语言中的字符串。乍一看字符串似乎是一个过于简单的话题不值得专门撰写一篇博文。然而要真正善用字符串不仅需要理解其工作原理还需要辨清字节byte、字符character和符文rune之间的区别理解 Unicode 与 UTF-8 的差异区分字符串与字符串字面量以及其他更为细微的差别。理解这个话题的一种方式是回答一个常见问题“当我通过索引n访问 Go 字符串时为什么我得到的不是第n个字符”正如您将看到的这个问题将引导我们深入了解现代世界中文本处理的诸多细节。Joel Spolsky 的著名博文《每个软件开发者都必须绝对、肯定、知道的 Unicode 和字符集的最少知识 (没有借口)》对其中一些问题做了精彩的介绍其观点也将在本文中得到呼应。什么是字符串让我们从一些基础知识开始。在 Go 语言中字符串本质上是一个只读的字节切片。如果您对字节切片是什么或如何工作有任何疑问请务必阅读我们之前的博文本文将假定您已了解相关背景。首先要明确的是字符串可以容纳任意字节。它不强制要求包含 Unicode 文本、UTF-8 文本或任何其他预定义格式。就字符串的内容而言它与字节切片完全等价。这是一个字符串字面量稍后会详细介绍它使用\xNN表示法来定义一个包含一些特殊字节值的字符串常量。当然字节的十六进制值范围从 00 到 FF包括两端。Goconst sample \xbd\xb2\x3d\xbc\x20\xe2\x8c\x98打印字符串由于sample字符串中的某些字节既不是有效的 ASCII也不是有效的 UTF-8直接打印字符串会产生混乱的输出。简单的fmt.Println语句Gofmt.Println(sample)会产生以下乱码具体外观因环境而异 ⌘为了了解这个字符串真正包含什么我们需要将其拆解并检查各个部分。有几种方法可以做到这一点。最直接的方法是循环遍历其内容并单独取出字节就像这个for循环一样Gofor i : 0; i len(sample); i { fmt.Printf(%x , sample[i]) }如前所述对字符串进行索引访问的是单个字节而不是字符。我们将在下面详细讨论这个话题。现在让我们只关注字节。这是按字节循环的输出bd b2 3d bc 20 e2 8c 98请注意单个字节如何与定义字符串的十六进制转义序列相匹配。生成可呈现的混乱字符串输出的更短方法是使用fmt.Printf的%x十六进制格式动词。它只会将字符串的连续字节作为十六进制数字打印出来每个字节两位。Gofmt.Printf(%x\n, sample)将其输出与上面的进行比较bdb23dbc20e28c98一个巧妙的技巧是在该格式中使用“空格”标志在%和x之间加上一个空格。将此处使用的格式字符串与上面的进行比较Gofmt.Printf(% x\n, sample)请注意字节之间如何出现空格使结果不那么令人感到压迫bd b2 3d bc 20 e2 8c 98还有更多。%q引用动词将转义字符串中任何不可打印的字节序列使输出清晰明了。Gofmt.Printf(%q\n, sample)当字符串大部分内容可理解为文本但有一些需要找出特殊之处时此技术非常方便它会生成\xbd\xb2\xbc ⌘如果我们眯着眼睛看可以看到在噪音中埋藏着一个 ASCII 等号以及一个普通空格末尾出现了著名的瑞典“兴趣点”符号。该符号的 Unicode 值为 U2318由空格十六进制值20后的字节e2 8c 98以 UTF-8 编码。如果我们对字符串中的奇怪值不熟悉或感到困惑可以使用%q动词的“加号”标志。此标志会使输出不仅转义不可打印序列还会转义任何非 ASCII 字节同时解释 UTF-8。结果是它会暴露字符串中表示非 ASCII 数据的正确格式化 UTF-8 的 Unicode 值Gofmt.Printf(%q\n, sample)使用这种格式瑞典符号的 Unicode 值会显示为\u转义序列\xbd\xb2\xbc \u2318这些打印技术在调试字符串内容时很有用并且在接下来的讨论中也会派上用场。值得指出的是所有这些方法对于字节切片和字符串的行为完全相同。以下是我们列出的所有打印选项的完整集合作为一个完整的程序呈现您可以在浏览器中直接运行和编辑Gopackage main import fmt func main() { const sample \xbd\xb2\x3d\xbc\x20\xe2\x8c\x98 fmt.Println(Println:) fmt.Println(sample) fmt.Println(Byte loop:) for i : 0; i len(sample); i { fmt.Printf(%x , sample[i]) } fmt.Printf(\n) fmt.Println(Printf with %x:) fmt.Printf(%x\n, sample) fmt.Println(Printf with % x:) fmt.Printf(% x\n, sample) fmt.Println(Printf with %q:) fmt.Printf(%q\n, sample) fmt.Println(Printf with %q:) fmt.Printf(%q\n, sample) }UTF-8 与字符串字面量正如我们所见对字符串进行索引访问的是它的字节而不是它的字符字符串只是一串字节。这意味着当我们在字符串中存储一个字符值时我们存储的是它的字节表示。让我们看一个更受控的例子了解它是如何发生的。这是一个简单的程序它以三种不同的方式打印一个包含单个字符的字符串常量一次是普通字符串一次是仅 ASCII 引用的字符串一次是十六进制的单个字节。为了避免任何混淆我们创建一个用反引号括起来的“原始字符串”这样它只能包含字面文本。普通的字符串用双引号括起来可以包含我们上面展示的转义序列。Gofunc main() { const placeOfInterest ⌘ fmt.Printf(plain string: ) fmt.Printf(%s, placeOfInterest) fmt.Printf(\n) fmt.Printf(quoted string: ) fmt.Printf(%q, placeOfInterest) fmt.Printf(\n) fmt.Printf(hex bytes: ) for i : 0; i len(placeOfInterest); i { fmt.Printf(%x , placeOfInterest[i]) } fmt.Printf(\n) }输出结果是plain string: ⌘ quoted string: \u2318 hex bytes: e2 8c 98这提醒我们Unicode 字符值 U2318即“兴趣点”符号 ⌘由字节e2 8c 98表示这些字节是十六进制值 2318 的 UTF-8 编码。这可能是显而易见的也可能是微妙的取决于您对 UTF-8 的熟悉程度但值得花点时间解释一下字符串的 UTF-8 表示是如何创建的。简单的事实是它是在源代码编写时创建的。Go 语言中的源代码被定义为 UTF-8 文本不允许使用其他表示。这意味着当我们在源代码中写入文本⌘用于创建程序的文本编辑器会将符号 ⌘ 的 UTF-8 编码放入源代码文本中。当我们打印出十六进制字节时我们只是倾倒了编辑器放入文件中的数据。简而言之Go 源代码是 UTF-8因此字符串字面量的源代码就是 UTF-8 文本。如果该字符串字面量不包含转义序列原始字符串不能包含则构建的字符串将完全包含引号之间的源代码文本。因此根据定义和构造原始字符串将始终包含其内容的有效 UTF-8 表示。同样除非它包含像上一节中那样的破坏 UTF-8 的转义序列否则常规字符串字面量也始终包含有效的 UTF-8。有些人认为 Go 字符串总是 UTF-8但它们不是只有字符串字面量是 UTF-8。正如我们在上一节中所示字符串值可以包含任意字节正如我们在本节中所示字符串字面量只要它们没有字节级转义总是包含 UTF-8 文本。总而言之字符串可以包含任意字节但当从字符串字面量构建时这些字节几乎总是是 UTF-8。码点、字符与符文到目前为止我们一直非常小心地使用“字节”和“字符”这两个词。这部分是因为字符串存储的是字节部分是因为“字符”的概念有点难以定义。Unicode 标准使用术语“码点”code point来指代由单个值表示的项。码点 U2318十六进制值为 2318表示符号 ⌘。有关该码点的更多信息请参阅其 Unicode 页面。举一个更通俗的例子Unicode 码点 U0061 是小写拉丁字母 Aa。但是小写重音字母 Aà 呢这是一个字符它也是一个码点U00E0但它还有其他表示。例如我们可以使用“组合”重音码点 U0300并将其附加到小写字母 aU0061上从而创建相同的字符 à。通常一个字符可能由许多不同的码点序列表示因此也可能由不同的 UTF-8 字节序列表示。因此计算中的字符概念是模棱两可的或者至少是令人困惑的所以我们谨慎使用它。为了使事情可靠存在规范化技术可以保证给定的字符始终由相同的码点表示但这个主题现在让我们偏离了话题太远。后续的博文将解释 Go 库如何处理规范化。“码点”这个词有点拗口所以 Go 引入了一个更短的术语来表示这个概念符文rune。这个术语出现在库和源代码中其含义与“码点”完全相同但有一个有趣的补充。Go 语言将rune这个词定义为int32类型的别名因此程序可以清楚地表明一个整数值表示一个码点。此外您可能认为的字符常量在 Go 中被称为符文常量。表达式⌘的类型和值是rune整数值为0x2318。总结一下以下是几个要点Go 源代码始终是 UTF-8。字符串包含任意字节。字符串字面量如果没有字节级转义总是包含有效的 UTF-8 序列。这些序列代表 Unicode 码点称为符文。Go 不保证字符串中的字符经过规范化。Range 循环除了 Go 源代码是 UTF-8 这一公理细节之外Go 对 UTF-8 的特殊处理方式只有一种那就是在对字符串使用for range循环时。我们已经看到了常规for循环会发生什么。相比之下for range循环在每次迭代时解码一个 UTF-8 编码的符文。每次循环时循环的索引是当前符文的起始位置以字节为单位码点是其值。这是一个例子使用了另一个方便的Printf格式%#U它显示了码点的 Unicode 值及其打印表示Goconst nihongo 日本語 for index, runeValue : range nihongo { fmt.Printf(%#U starts at byte position %d\n, runeValue, index) }输出显示了每个码点如何占用多个字节U65E5 日 starts at byte position 0 U672C 本 starts at byte position 3 U8A9E 語 starts at byte position 6标准库Go 的标准库为解释 UTF-8 文本提供了强大的支持。如果for range循环不足以满足您的需求那么您需要的设施很可能由库中的包提供。最重要的此类包是unicode/utf8它包含用于验证、拆解和重新组装 UTF-8 字符串的辅助例程。这是一个与上述for range示例等效的程序但使用该包中的DecodeRuneInString函数来完成工作。该函数的返回值是符文及其在 UTF-8 编码字节中的宽度。Goconst nihongo 日本語 for i, w : 0, 0; i len(nihongo); i w { runeValue, width : utf8.DecodeRuneInString(nihongo[i:]) fmt.Printf(%#U starts at byte position %d\n, runeValue, i) w width }运行它您会看到它执行相同的功能。for range循环和DecodeRuneInString被定义为产生完全相同的迭代序列。查阅unicode/utf8包的文档以查看它还提供了哪些其他功能。结论回答开头提出的问题字符串由字节构成因此对其进行索引会得到字节而不是字符。字符串甚至可能不包含字符。事实上“字符”的定义是模糊的试图通过定义字符串由字符组成来解决这种模糊性将是一个错误。关于 Unicode、UTF-8 和多语言文本处理的世界还有很多要说的但这可以留待另一篇文章。现在我们希望您对 Go 字符串的行为有了更好的理解并且尽管它们可能包含任意字节但 UTF-8 是其设计的核心部分。原文https://go.dev/blog/strings
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

海南做网站的技术公司济南高新区网站建设公司

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 同行可拿货,招校园代理 小程序springboot电子数码产品租赁系统_g390v54f 主…

张小明 2026/1/11 22:38:20 网站建设

机关内网站建设方案书专业制作网站的基本步骤

PyZh项目:Python技术文档翻译与协作平台完全指南 【免费下载链接】PyZh :books: 一起写Python文章,一起看Python文章 - 利用readthedocs的Python技术文章的收集和翻译。 项目地址: https://gitcode.com/gh_mirrors/py/PyZh PyZh是一个专注于Pytho…

张小明 2026/1/10 5:56:25 网站建设

正规的家居行业网站开发wordpress插件哪里下载

集成学习、随机森林与AdaBoost 系统梳理 本文将从集成学习基础、随机森林(Bagging代表)、AdaBoost(Boosting代表) 三个核心模块,结合语法、表格、实战案例,系统讲解相关知识,并补充扩展算法与对…

张小明 2026/1/10 23:42:08 网站建设

灰色词网站seo怎么做百度网站推广

从学术研究到工业落地:Llama-Factory打通大模型最后一公里 在大模型技术席卷全球的今天,越来越多的企业和研究团队开始尝试将LLaMA、Qwen这类强大的预训练语言模型应用于实际业务场景。然而,理想很丰满,现实却常常骨感——一个通用…

张小明 2026/1/10 23:42:06 网站建设

h5游戏盒子连云港seo公司

本文详细介绍了如何使用Dify搭建企业级本地知识库,解决了远程调用方案的痛点。文章从知识库概念、私有化部署必要性入手,提供了完整的环境准备、文档上传、分段清洗、索引设置等实操步骤,并解答了数据安全、PDF解析、文件格式限制等常见问题。…

张小明 2026/1/10 23:42:04 网站建设

在线做托福的网站wordpress 4.9 安装

LED阵列汉字显示实验:从点阵扫描到视觉艺术的底层逻辑你有没有想过,一块小小的1616 LED点阵,是如何“写出”一个“中”字的?它没有操作系统,没有图形引擎,甚至连基本的绘图指令都没有。但它却能在你眼前稳稳…

张小明 2026/1/10 23:42:03 网站建设