成品网站 售卖wordpress ajax本地化

张小明 2026/1/7 15:17:36
成品网站 售卖,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进行投诉反馈,一经查实,立即删除!

网站开发建设类合同没有备案的网站可以用ip访问吗

一、问题描述日期类型datetime、timestamp类型的日期字段,查询时返回的JSON响应报文中带有T,这是因为MySQL遵循ISO 8601标准,在日期和时间之间使用"T"作为分隔符 。 ISO 8601是国际标准化组织(ISO)发布的日期…

张小明 2026/1/2 6:31:52 网站建设

企业网站备案所需材料 amp免费开发个人小程序的平台

&#x1f4cb; 一、组件概述与核心构成 DevUI 的表单组件 (dForm) 是一套用于数据收集、校验和提交的完整解决方案。基于Angular 18.0.0框架&#xff0c;涵盖了从基本结构到高级验证的完整内容。它结构清晰&#xff0c;通常由以下几个核心部分嵌套构成&#xff1a;<form dFo…

张小明 2026/1/2 6:31:20 网站建设

电商企业网站建设情况企业邮箱登录入口网页版

亚马逊云服务器概述亚马逊云服务器&#xff08;Amazon Elastic Compute Cloud&#xff0c;简称 Amazon EC2&#xff09;是亚马逊网络服务&#xff08;AWS&#xff09;提供的核心云计算服务之一。EC2允许用户在云端租用虚拟计算资源&#xff0c;按需扩展或缩减计算能力&#xff…

张小明 2026/1/7 7:43:56 网站建设

google建立网站植物园门户网站建设方案

很多产品陷入“功能越多越强大”的误区,却忽略了用户在碎片化场景下的核心诉求—当一位博主在通勤途中想用手机编辑图文时,过多的排版选项会成为认知负担,而过于简化的功能又无法满足专业表达需求。这就需要建立“感知负荷拆解模型”,将复杂功能拆解为“基础必选”“进阶可…

张小明 2026/1/2 6:29:12 网站建设

网站是com好点还是cn哪个网站可以接程序项目来做

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

张小明 2026/1/2 6:28:41 网站建设

上海企业网站建设公爱原物设计网

近日&#xff0c;上海量子城市空间智能建设年度成果之一——全国规划资源领域首个基础大模型“云宇星空大模型&#xff08;专业版&#xff09;”正式发布&#xff01; 该模型由上海市规划资源局联合商汤大装置共同研发&#xff0c;不仅填补了行业空白&#xff0c;更以“问不倒…

张小明 2026/1/2 6:28:09 网站建设