HarmonyOS Next字符编码奥秘:Rune与Unicode遍历

Go 学习笔记(31)— 字符串 string、字符 rune、字节 byte、UTF-8 和 Unicode 区别以及获取字符串长度 1. 字符串 string 类型 Go 语言中字符串的内部实现使用 UTF-8 编码,通过 rune 类型,可以方便地对每个 UTF-8 字符进行访问。当然, Go 语言也支持按照传统的 ASCII 码方式逐字符进行访问。 字符串是常量,可以通过类似数组索引访问其字节单元,但是不能修改某个字节的值; var a string = "hello,world" b := a[0] a[1] = "a" // error 内置的 len 函数可以返回一个字符串中的字节数目(不是 rune 字符数目) 阅读详情

在HarmonyOS Next开发中,字符编码的正确处理对于构建全球化、多语言支持的应用至关重要。仓颉语言中的Rune类型为处理Unicode字符提供了强大的支持。作为在该领域有丰富实践经验的技术专家,下面我将深入探讨Rune类型的原理、特殊场景处理以及性能优化方法。

第一章:字符表示

Rune类型用于表示Unicode字符集中的所有字符,其字面量形式丰富多样,如\u{4f60}表示汉字“你”。下面分析\u{4f60}的UTF - 8编码过程:

  1. \u{4f60}是Unicode代码点,将其转换为二进制为0100111101100000。
    1. 根据UTF - 8编码规则,对于大于0x07FF的代码点,需要用3个字节表示。编码模式为1110xxxx 10xxxxxx 10xxxxxx。
    1. 将0100111101100000按规则填充到编码模式中,得到11100100 10111101 10100000,转换为十六进制就是E4BD A0。这就是“你”字在UTF - 8编码下的字节序列。
      理解这个编码过程有助于开发者在处理字符存储、网络传输等场景时,确保字符编码的正确性,避免因编码问题导致的乱码或数据丢失。

第二章:特殊场景

在处理Unicode字符时,会遇到代理对(Surrogate Pair)的特殊情况。代理对用于表示那些无法用单个16位代码单元表示的字符(即码点大于0xFFFF的字符)。例如,一些表情符号就属于这类字符。

在仓颉语言中,处理代理对需要特别小心。假设要遍历包含代理对的字符串并正确识别每个字符:

let emojiString = "\u{D83D}\u{DE03}" // 表示大笑表情
for (rune in emojiString.runes) {
    print(rune)
    }
    ```
    在这个例子中,通过`runes`属性可以按字符(而不是字节或代码单元)遍历字符串。这样,即使字符串中包含代理对,也能正确识别和处理每个字符,避免将代理对拆分成两个错误的字符。在实际开发中,处理包含特殊字符的文本,如社交媒体内容、国际化文档时,正确处理代理对是保证文本处理准确性的关键。
## 第三章:性能优化
在处理大量字符数据时,性能优化尤为重要。预编译字符集并构建Trie树是一种有效的优化手段。Trie树是一种树形数据结构,用于高效存储和检索字符串集合。

假设要在一段文本中快速查找特定字符集内的字符,可以先构建一个包含这些字符的Trie树:
```cj
class TrieNode {
    var children: [Character: TrieNode] = [:]
        var isEndOfWord: Bool = false
        }
class Trie {
    var root: TrieNode = TrieNode()
    func insert(_ word: String) {
            var node = root
                    for char in word {
                                if node.children[char] == nil {
                                                node.children[char] = TrieNode()
                                                            }
                                                                        node = node.children[char]!
                                                                                }
                                                                                        node.isEndOfWord = true
                                                                                            }
    func search(_ word: String) -> Bool {
            var node = root
                    for char in word {
                                if node.children[char] == nil {
                                                return false
                                                            }
                                                                        node = node.children[char]!
                                                                                }
                                                                                        return node.isEndOfWord
                                                                                            }
                                                                                            }
let trie = Trie()
let charSet = ["你", "好", "世", "界"]
for char in charSet {
    trie.insert(char)
    }
let text = "你好,世界!"
for (rune in text.runes) {
    let charStr = String(rune)
        if (trie.search(charStr)) {
                print("Found: \(charStr)")
                    }
                    }
                    ```
                    在上述代码中,先构建了一个包含特定字符集的Trie树,然后在遍历文本时,通过Trie树快速判断字符是否在字符集内。这种方式比逐个字符比较的效率高很多,特别是在处理长文本和较大字符集时,能够显著提升性能。
掌握`Rune`类型的字符表示原理、特殊场景处理以及性能优化方法,能够帮助开发者在HarmonyOS Next开发中更好地处理Unicode字符,构建高效、准确的多语言应用。无论是文本处理、搜索功能还是国际化支持,这些技术都将发挥重要作用。 
第10篇:打包上架:签名、打包 HAP、发布到华为应用市场 打包上架:签名、打包 HAP、发布到华为应用市场 阅读详情

相关推荐

软件工程:数据字典

数据字典

永远怀着至诚之心拥抱世界 4273

leetcode893特殊等价字符串组(893)

你将得到一个字符串数组 A。 每次移动都可以交换 S 的任意两个偶数下标的字符或任意两个奇数下标的字符。 如果经过任意次数的移动,S == T,那么两个字符串 S 和 T 是 特殊等价 的。 例如,S = “zzxy” 和 T = “xyzz” 是一对特殊等价字符串,因为可以先交换 S[0] 和 S[2],然后交换 S[1] 和 S[3],使得 “zzxy” -> “xzzy” -> “xyzz” 。 现在规定,A 的 一组特殊等价字符串 就是 A 的一个同时满足下述条件的非空子集: 该组中的.

you are sherlocked by me! 606

std::map看来可以被淘汰了?可以用vector来替代,而且更好

vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。

tumu_C的博客 1019

个人总结cangjie仓颉程序设计-(一)

不套官方模板,记录学习仓颉的历程

m0_56266038的博客 1048

从零开始:手把手教你设计人形机器人锂电池供电系统

人形机器人要像人类一样“活起来”,必须有稳定的“能量血液”——供电系统。本文聚焦锂电池供电系统如何根据机器人功耗选择合适的锂电池参数(容量、电压、放电倍率);如何设计电池管理系统(BMS)保护电池安全;如何解决机器人运动时的“瞬时大电流”供电难题;如何通过硬件电路和代码实现供电系统的监测与控制。用“机器人小助手的能量危机”故事引入锂电池供电系统;拆解锂电池核心参数(容量、电压、放电倍率)和供电系统三大组件(电池组、BMS、电源转换模块);

AI天才研究院 1758

3 路由引入

在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。

lwljh134的博客 621

Golang 中的 String、rune 和 byte

希望大家通过这篇文章可以巩固自己对这几种类型的理解,以及更方便的对它们进行转换。

ldxxxxll的博客 774

手把手教你学SIMULINK模块库文件专栏--Scope 模块详解

模块是 Simulink 中的一个信号接收模块,用于实时显示信号波形。该模块可以捕捉并可视化仿真过程中信号的变化,帮助用户直观地分析系统的动态行为。模块都能提供强有力的支持。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常实用的工具,适用于需要实时显示信号波形的各种场景。模块的参数,可以进一步增强学习体验。模块参数的影响,下面我们将详细探讨每个参数如何影响波形显示。

MHD0815的博客 312

HarmonyOS Next仓颉语言入门:标识符与Unicode规范解析

在HarmonyOS Next的开发环境中,仓颉语言作为核心开发语言,其基础概念的掌握至关重要。其中,标识符与Unicode规范是编写正确且高效代码的基石。作为一名在该领域有丰富实践经验的技术人员,下面我将结合实际项目中的经验,深入解析这些关键知识点。

same4869的博客 651

AUTOSAR从入门到精通-复杂设备驱动(CDD)

CDD是复杂设备驱动的首字母缩写主要为驱动程序或复杂驱动程序,但不限于驱动程序。复杂驱动程序是一种未被AUTOSAR标准化的软件实体,可以通过AUTOSAR接口和/或基本软件模块api访问。 CDD是位于基础软件复杂驱动层的特定模块,与标准BSW模块或Rte交互。 CDD可能需要与分层软件体系结构的模块连接 分层软件架构的模块可能需要连接到CDD CDD可能需要通过Rte连接swc。

getusushu的博客 4192

YOLOv13优化:PoolingFormerCGLU模块 MetaFormer 框架 + 池化混合器 手把手教你自注意力

PoolingFormer1 是一个基于 MetaFormer 框架 的轻量化卷积-Transformer 混合模块,通过 Pooling 取代自注意力,实现: 更低的计算成本 一定的全局信息融合 兼容 CNN 和 Transformer 的优点

FJN110的博客 425

Go语言入门:string、rune

初始化 msg := "hello world" cnMsg := "你好世界" multiline := ` select * from table where col='val' ` 单行的字符串初始化和大部分语言一样,使用双引号,支持和python一样的多行,但是用反单引号,就是键盘上按键区最左上角的那个符号。 长度 msg := "hello world" fmt....

零壹视界 854

Flink实战(101):双流join(三)双流中实现Inner Join、Left Join与Right Join

声明:本系列博客是根据SGG的视频整理而成,非常适合大家入门学习。 《2021年最新版大数据面试题全面开启更新》 简介 之前文章中提到JoinedStream与CoGroupedStream,例如下列代码: dataStream.join(otherStream) .where(0).equalTo(1) .window(TumblingEventTimeWindows.of(Time.seconds(3))) .apply { ... } 由于joinedStream与

微信搜:import_bigdata,大数据领域硬核原创作者 736

pyg Symbol not found: __ZN2at8internal13_parallel_runExxxRKNSt3__18functionIFvxxmEE

【代码】pyg Symbol not found: __ZN2at8internal13_parallel_runExxxRKNSt3__18functionIFvxxmEE。

Learning from the mistakes 1634

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Golang的rune数据类型,Unicode字符编码与UTF-8字节码

转载:https://www.jianshu.com/p/4fbf529926ca rune类型: // rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by convention, to distinguish character values from integer values. //int32的别名,几乎在所有方面等同于int32 //它用来区分字符值和整数值 type r

HayPinF的博客 2357

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【go】类型byte和rune是什么

要讨论byte和rune,自然就离不开unicode字符集,那么什么是unicode字符集呢?我们知道计算机存储的都是二进制,如果一个字符要存储到计算机中,那么会事先通过一个映射关系表,也就是我们所说的unicode字符集,找到这个字符对应的16进制表示。unicode字符集收录了世界上所有的字符,不管汉字或者英文、数字、符号等,里面都可以找到一个对应的16进制的表示。 例如:“你好,wei”,在unicode字符集中对应的16进制是这样表示的 你 4f60 好 597d , ff0c w

doublewe的博客 329

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

华为昇腾910B4(A2)服务器环境搭建笔记

Qwen3.5 默认支持思考模式。首次测试建议关闭思考模式,更容易判断模型是否成功回答。我建议把模型统一存放在宿主机的 /data/models 目录中。这样即使删除 Docker 容器,模型文件也不会丢失。这里先进行单卡测试,确保容器能正确调用 NPU。安装ModelScope 用于下载模型。继续在刚才的容器内部执行。

guoqingru0311的博客 296

IPD咨询洞察:华为项目文化:让胜利成为一种信仰

华为“让胜利成为信仰”的本质是使命必达,落地为五项内核:开放创新、勇于担当、团队协同、契约精神、善思善结。使命必达不能停留在墙面标语,须转化为可落地、可考核的行为准则,胜利才能真正成为团队习惯。

weixin_58096508的博客 102

手头只有华为配置,新设备是华三?粘进来自动翻

手头有华为配置,新设备是华三?用「跨厂商转换」工具,粘贴配置后自动识别源厂商,一键转成目标厂商语法,支持华为、华三、锐捷、迈普、思科等主流设备。精准处理VLAN、access/trunk口、SVI IP、VTY/SSH等差异,避免手动修改时漏改“拼写级”错误。转换后需人工核对核心项与独有特性,建议结合备份、比对与模拟验证,确保安全上机。

qq_42614669的博客 388

【2026-11-06】华为研发机试三道编程题解

本文整理了华为11月6日研发岗三道编程题解法:第一题为按列填充句子,通过枚举行数模拟列宽计算,求最小行数;第二题为生鲜库存优化,利用动态分配思想,预处理“采购-销售”成本,贪心选择最便宜来源满足需求;第三题涉及AC自动机与动态规划结合的序列化奖励问题。代码均以Java实现,思路清晰,适合笔试刷题参考。关注公众号【TechGuide】获取更多真题解析。

试问道几许 359

华为HCIP网络工程师认证—网络管理与运维

随着网络的规模越来越庞大,网络中的设备种类繁多,如何对越来越复杂的网络进行有效的管理,从而提供高质量的网络服务,已成为网络管理所面临的巨大挑战。网络的管理与运维手段多样,本博客将对几种网络管理与运维手段展开介绍。网络管理与运维,就是让你从“一台一台跑去敲命令的消防员”,变成“坐在总控室看大屏的指挥官”的一套技术体系。 它的核心目标就四个字:可视、可控——你得先“看见”网络在发生什么,然后才能“控制”它不出事。网络管理与运维,在 HCIP 里不像 OSPF、VLAN 那样需要算得很深,但它是一个“框架性”……

极客园地 246

华为VXLAN OVER EVPN(EBGP)

本文基于 eNSP Pro 模拟器,完整复现 Spine-Leaf 架构下 VXLAN over EVPN 的二层互通实验。实验目标是:通过 EBGP 在 Spine 与 Leaf 之间建立 Underlay 路由,再借助 BGP EVPN 承载 VXLAN 隧道,最终实现跨 Leaf 的同一子网二层互通,并验证头端复制(Head-End Replication)方式的 BUM 流量转发。

256

华为云云硬盘 EVS:挂载、初始化与快照回滚,一块数据盘的完整生命周期

一块云硬盘的生命周期是「买 → 挂 → 初始化 → 用 → 卸 → 再挂」。Windows 靠磁盘管理初始化、靠脱机保证能换机;Linux 靠。

xbzb的博客 707

YOLOv11m 部署华为 Atlas 300I Pro

部署到的全过程拆成可照抄的步骤:装驱动固件 → 装 CANN toolkit 与算子包 → 装 Ultralytics / ais_bench → 导出 ONNX → ATC 编译成.om→ 命令行/Python 推理 → CPU 端解码 NMS。给出两条路线(一键导出 / 手工 ATC)、完整可运行的预处理与后处理代码、报错排查表和验收清单。先认清硬件:300I Pro 到底是颗什么芯片部署总览:软件栈与两条技术路线环境与软件清单(开工前先对齐)

巽视达的专栏 574
上一篇: HarmonyOS Next字符串艺术:从插值到正则匹配
下一篇: HarmonyOS Next特殊类型:Unit与Nothing的哲学
SameX-4869
博客等级 码龄18年 3354粉丝 657原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值