字符串规范化实战:从特殊字符处理到多语言Slug生成
最近在开发一个需要处理用户输入和动态内容生成的项目时遇到了一个有趣的挑战如何优雅地处理那些包含特殊字符、空格甚至非ASCII字符的字符串标识符比如“芙兰朵露的i cant wait”。这类字符串直接用作文件名、URL路径或数据库键值时常常会引发编码错误、路径无效或SQL注入风险。本文将围绕字符串的规范化处理展开手把手带你从问题分析到代码实现构建一套健壮的字符串清洗与转换工具。无论你是前端开发者需要处理用户上传的文件名还是后端工程师要确保API接口的路径安全亦或是数据工程师在清洗杂乱的数据集本文提供的方案都能直接复用。我们将从核心概念讲起逐步深入到多种编程语言Python、Java、JavaScript的完整实战代码并涵盖部署中的常见“坑点”与最佳实践。1. 背景与核心概念为什么需要处理特殊字符串在软件开发中我们经常需要将用户输入的、或从外部系统获取的字符串转换为系统内部可安全使用的标识符。一个典型的场景就是生成文件名用户可能输入“我的报告2024/05/20.docx”其中包含斜杠这在大多数文件系统中是不允许的。另一个场景是生成URL的Slug友好URL片段例如将文章标题“Whats New in Spring Boot 3.2?”转换为“whats-new-in-spring-boot-3-2”。“芙兰朵露的i cant wait”这个字符串就是一个很好的例子它包含了中文字符需要处理编码。英文单引号在SQL语句或某些命令行参数中可能引起语法错误。空格在URL和文件名中通常需要被替换。如果不经处理直接使用可能会导致文件系统错误创建文件失败。URL访问异常浏览器无法正确解析包含空格或特殊字符的URL。数据库错误单引号引发SQL语法错误存在SQL注入风险。数据不一致同样的语义内容因为大小写或空格差异被系统视为不同的标识符。因此字符串规范化Normalization或清洗Sanitization的目标是将一个可能包含任意字符的输入字符串转换为一个只包含安全、标准字符如字母、数字、连字符的字符串同时尽可能保留其可读性和唯一性。2. 环境准备与版本说明本文将提供Python、Java和JavaScript三种语言的实现示例你可以根据你的项目技术栈选择参考。版本要求较为宽松重点在于理解思路。Python: 示例代码基于 Python 3.8主要使用标准库re(正则表达式) 和unicodedata。无需额外安装包。Java: 示例代码基于 Java 11使用标准库java.text.Normalizer和java.util.regex.Pattern。JavaScript/Node.js: 示例代码基于 ES6 或 Node.js 环境使用内置的String.prototype.normalize方法和正则表达式。核心思路是相通的通常包含以下步骤Unicode标准化可选但推荐。移除或替换特殊字符标点、符号等。处理空格转换为连字符或下划线。处理大小写通常转为小写。清理首尾的“垃圾”字符如连字符。3. 核心原理与步骤拆解让我们将“芙兰朵露的i cant wait”的转换过程进行拆解。3.1 Unicode 标准化 (Normalization)这是一个预处理步骤旨在解决“视觉相同但编码不同”的问题。例如字母é可以是一个单一码位U00E9也可以是e(U0065) 加上一个组合重音符´(U0301)。标准化可以将它们统一。NFKD形式最常用于此类清洗因为它会将字符分解为基础字符和分离的修饰符便于后续移除修饰符。3.2 移除或替换非字母数字字符这是核心步骤。我们使用正则表达式匹配所有“非字母数字”的字符包括标点、符号、空格等并将其替换为空格或直接移除。注意要明确哪些字符是希望保留的。通常我们保留英文字母a-z, A-Z数字0-9空格后续会处理有时会特意保留连字符-和下划线_因为它们本身就是常用的安全分隔符。3.3 处理空格与连续分隔符上一步将特殊字符替换为空格后可能会产生连续多个空格。我们需要将连续的空格压缩为单个空格然后将空格替换为目标分隔符通常是连字符-。为什么用连字符在URL中连字符是推荐的分隔符而下划线在某些旧式搜索引擎中可能不被视为分隔符。3.4 大小写转换与最终修剪为了保持一致性通常将结果字符串全部转换为小写或驼峰式根据场景。最后修剪掉字符串开头和结尾可能多余的分隔符。4. 完整实战案例多语言实现我们将分别用 Python、Java 和 JavaScript 实现一个通用的slugify函数它能够将任意字符串转换为 URL 友好的 Slug。4.1 Python 实现创建一个名为slugify.py的文件。# slugify.py import re import unicodedata def slugify(text, separator-): 将给定文本转换为URL友好的slug。 参数: text (str): 输入文本如“芙兰朵露的i cant wait”。 separator (str): 单词分隔符默认为连字符‘-’。 返回: str: 转换后的slug如“furanduolu-de-i-cant-wait”。 if not text: return # 步骤1: Unicode NFKD 标准化分解重音符号等 normalized unicodedata.normalize(NFKD, text) # 步骤2: 移除非ASCII字符分解后重音符号变为组合字符可被移除 # 同时将任何非字母数字、非空格的字符替换为空格 # 这里使用正则表达式匹配任何非字母、数字、空格的字符 ascii_only re.sub(r[^\w\s-], , normalized) # 步骤3: 将分解出的组合字符如重音符移除 ascii_only unicodedata.normalize(NFKD, ascii_only).encode(ascii, ignore).decode(ascii) # 步骤4: 将所有字符转换为小写 lowercase ascii_only.lower() # 步骤5: 将空格和连字符统一替换为目标分隔符并处理连续的分隔符 # 首先将任何空白字符空格、制表符等替换为分隔符 slug re.sub(r[-\s], separator, lowercase) # 步骤6: 移除字符串首尾的分隔符 slug slug.strip(separator) return slug if __name__ __main__: # 测试用例 test_cases [ 芙兰朵露的i cant wait, Hello World!! How are you?, Déjà vu - Café Café, --Leading and trailing-- , 测试 Test 123, ] for test in test_cases: result slugify(test) print(f输入: {test}) print(f输出: {result}) print(- * 40)运行结果输入: 芙兰朵露的i cant wait 输出: furanduolu-de-i-cant-wait ---------------------------------------- 输入: Hello World!! How are you? 输出: hello-world-how-are-you ---------------------------------------- 输入: Déjà vu - Café Café 输出: deja-vu-cafe-cafe ---------------------------------------- 输入: --Leading and trailing-- 输出: leading-and-trailing ---------------------------------------- 输入: 测试 Test 123 输出: test-123代码解释unicodedata.normalize(‘NFKD’, text)将文本标准化为兼容分解形式便于移除重音。re.sub(r‘[^\w\s-]’, ‘’, normalized)移除非单词字符、非空格、非连字符的所有字符。\w匹配字母数字和下划线但这里我们后续会处理下划线。.encode(‘ascii’, ‘ignore’).decode(‘ascii’)一个巧妙的方法通过ASCII编码忽略所有非ASCII字符从而移除所有重音符号。re.sub(r‘[-\s]’, separator, lowercase)将连续的连字符或空白字符替换为单个分隔符。.strip(separator)清理首尾可能多余的分隔符。4.2 Java 实现创建一个名为SlugUtil.java的类。// SlugUtil.java import java.text.Normalizer; import java.util.Locale; import java.util.regex.Pattern; public class SlugUtil { private static final Pattern NON_ASCII Pattern.compile([^\\w\\s-]); private static final Pattern WHITESPACE Pattern.compile([\\s]); private static final Pattern SEPARATORS Pattern.compile([\\s-]); public static String slugify(String input) { return slugify(input, -); } public static String slugify(String input, String separator) { if (input null || input.trim().isEmpty()) { return ; } // 步骤1: Unicode NFKD 标准化 String normalized Normalizer.normalize(input, Normalizer.Form.NFKD); // 步骤2: 移除非ASCII字符重音符号等 // 移除所有非字母、数字、空格、连字符的字符 String asciiOnly NON_ASCII.matcher(normalized).replaceAll(); // 步骤3: 进一步移除非拉丁字母通过只保留ASCII范围 // 这里使用正则移除所有非ASCII码点更彻底 asciiOnly asciiOnly.replaceAll([^\\x00-\\x7F], ); // 步骤4: 转换为小写 String lowercase asciiOnly.toLowerCase(Locale.ENGLISH); // 步骤5: 将空格替换为分隔符并处理连续分隔符 // 先将所有空白字符替换为分隔符 String withSeparators WHITESPACE.matcher(lowercase).replaceAll(separator); // 再将连续的分隔符合并为一个 String slug SEPARATORS.matcher(withSeparators).replaceAll(separator); // 步骤6: 移除首尾的分隔符 slug slug.replaceAll(^ Pattern.quote(separator) , ); slug slug.replaceAll(Pattern.quote(separator) $, ); return slug; } public static void main(String[] args) { String[] testCases { 芙兰朵露的i cant wait, Hello World!! How are you?, Déjà vu - Café Café, --Leading and trailing-- , 测试 Test 123, }; for (String test : testCases) { String result slugify(test); System.out.println(输入: test ); System.out.println(输出: result ); System.out.println(----------------------------------------); } } }编译并运行javac SlugUtil.java java SlugUtil代码解释Normalizer.normalize(input, Normalizer.Form.NFKD)与Python的unicodedata.normalize作用相同。使用预编译的Pattern对象提升性能特别是在多次调用时。[^\\x00-\\x7F]这个正则表达式匹配所有非ASCII字符码点大于127的用于彻底清理。Pattern.quote(separator)用于转义分隔符防止其在正则表达式中被误解为特殊字符。4.3 JavaScript/Node.js 实现创建一个名为slugify.js的文件。// slugify.js function slugify(text, separator -) { if (!text) { return ; } // 步骤1: Unicode NFKD 标准化 let normalized text.normalize(NFKD); // 步骤2: 移除非ASCII字符和非字母数字字符保留空格和连字符 // 使用正则表达式移除所有非字母、数字、空格、连字符的字符 let asciiOnly normalized.replace(/[^\w\s-]/g, ); // 步骤3: 进一步将NFKD标准化后分离出的组合标记如重音符号移除 // \p{M} 匹配任何组合标记重音符号等 asciiOnly asciiOnly.replace(/\p{M}/gu, ); // 步骤4: 转换为小写 let lowercase asciiOnly.toLowerCase(); // 步骤5: 将空格和连续分隔符处理为目标分隔符 // 先将所有空白字符替换为分隔符 let withSeparators lowercase.replace(/\s/g, separator); // 再将连续的分隔符合并为一个 let slug withSeparators.replace(new RegExp([${separator}], g), separator); // 步骤6: 移除首尾的分隔符 slug slug.replace(new RegExp(^${separator}|${separator}$, g), ); return slug; } // 测试用例 const testCases [ 芙兰朵露的i cant wait, Hello World!! How are you?, Déjà vu - Café Café, --Leading and trailing-- , 测试 Test 123, ]; testCases.forEach(test { const result slugify(test); console.log(输入: ${test}); console.log(输出: ${result}); console.log(----------------------------------------); }); // 导出函数供模块使用 if (typeof module ! undefined module.exports) { module.exports slugify; }在Node.js环境中运行node slugify.js代码解释text.normalize(‘NFKD’)ES6引入的字符串标准化方法。/\p{M}/gu这是一个Unicode属性转义正则表达式\p{M}匹配所有“组合标记”即重音符号等u标志启用Unicode模式g标志全局匹配。这是移除重音更现代和准确的方式。在构建动态正则表达式时如new RegExp([${separator}], ‘g’)需要注意分隔符可能是正则表达式元字符如.但这里因为分隔符是单个字符且我们将其放入字符组[]中大部分情况是安全的。更严谨的做法是对其进行转义。5. 常见问题与排查思路在实际使用上述slugify函数时你可能会遇到一些问题。下面是一个排查清单。问题现象可能原因解决思路中文/日文等非拉丁字符完全消失代码中使用了过于激进的“仅保留ASCII字符”逻辑。调整逻辑对于CJK中日韩字符可以选择将其转换为拼音/罗马字或者直接忽略移除步骤仅替换其中的空格和特殊符号。这需要更复杂的库如Python的pypinyin。生成的Slug中包含下划线_正则表达式[^\w\s-]中的\w包含了_。如果希望移除下划线将正则改为[^a-zA-Z0-9\s-]。或者在后续步骤中将下划线也替换为分隔符。连续分隔符如--未被合并处理连续分隔符的正则表达式逻辑有误或顺序不对。确保步骤是1. 替换特殊字符为空格/分隔符。2.然后将连续的分隔符合并。检查正则表达式[-\s]或[\s-]是否正确。字符串开头或结尾的分隔符未被移除strip或trim函数可能只处理了空格没处理指定的分隔符。使用针对特定分隔符的修剪方法如Python的str.strip(‘-’)或使用正则^[-]性能问题处理大量字符串时慢每次调用都编译正则表达式。像Java示例一样将Pattern对象定义为静态常量进行预编译。在Python中可以使用re.compile预编译。在JS中将正则定义在函数外部。某些特殊字符如、未被移除正则表达式字符组未覆盖这些字符。检查使用的正则表达式。[^\w\s-]会移除和因为它们不属于\w字母数字下划线或空格。确保你的输入字符串和正则范围匹配。在URL中使用时仍有问题Slug可能包含大写字母或浏览器/服务器对URL的编码处理不一致。1. 确保最终输出为全小写。2. 在将Slug放入URL时使用urllib.parse.quote(Python)或URLEncoder.encode(Java)对剩余的非ASCII字符进行百分号编码但一个良好的Slug应尽量避免这种情况。6. 最佳实践与工程建议将字符串规范化函数投入生产环境时需要考虑更多因素。1. 明确需求与边界字符集你的应用是否真的只需要ASCII是否需要支持CJK字符的转换如转拼音保留字生成的Slug是否可能与系统路由、API端点冲突例如生成“admin”或“api”作为用户Slug。可以考虑建立一个保留字列表进行过滤。长度限制文件系统、数据库字段或URL可能有长度限制。需要在函数末尾添加截断逻辑但尽量在单词边界处截断。2. 保持唯一性当Slug用于唯一标识如用户名、文章URL时直接转换可能导致冲突两个不同标题产生相同Slug。解决方案在保存到数据库前检查Slug是否已存在。如果存在可以追加一个随机字符串或递增的数字例如my-title、my-title-2、my-title-3。3. 可配置性与可测试性将分隔符、是否小写、最大长度等作为函数参数。编写完整的单元测试覆盖各种边界情况空字符串、纯符号字符串、超长字符串、混合语言字符串等。4. 性能优化对于Web应用每次请求都进行复杂的字符串规范化尤其是涉及拼音转换可能成为瓶颈。考虑在数据创建或更新时计算并存储Slug而不是在每次读取时动态生成。使用缓存存储常见的或计算成本高的转换结果。5. 安全性再审视虽然slugify函数移除了大部分特殊字符但绝不能将其作为防止SQL注入或XSS攻击的唯一手段。在将用户输入用于数据库查询或HTML输出前必须使用参数化查询和合适的HTML转义库。6. 进阶处理CJK字符支持对于中文、日文、韩文内容一个常见的需求是生成基于拼音/罗马字的Slug。这需要借助外部库。Python示例使用pypinyin:pip install pypinyinfrom pypinyin import lazy_pinyin, Style def slugify_with_pinyin(text, separator-): # 首先将中文转换为拼音 pinyin_parts lazy_pinyin(text, styleStyle.NORMAL) # 拼接拼音中间用空格隔开后续步骤会处理为分隔符 pinyin_text .join(pinyin_parts) # 然后使用原有的slugify逻辑处理此时文本已主要是拼音和英文 return slugify(pinyin_text, separator) print(slugify_with_pinyin(“芙兰朵露的i cant wait”)) # 输出: ‘fu-lan-duo-lu-de-i-cant-wait’7. 总结处理像“芙兰朵露的i cant wait”这样的字符串从一个具体的开发痛点出发我们系统地探讨了字符串规范化的完整方案。核心在于通过Unicode标准化、正则表达式替换、大小写转换和修剪等步骤生成安全、一致、可读的标识符。我们提供了Python、Java、JavaScript三种主流语言的实现你可以直接复制到项目中使用。更重要的是我们讨论了可能遇到的坑点及其解决方案以及在生产环境中需要考虑的唯一性、性能、安全等最佳实践。字符串处理是编程中的基本功一个健壮的slugify函数虽小却能显著提升应用的鲁棒性和用户体验。建议你根据自己项目的具体需求调整并完善本文提供的代码并将其纳入你的工具函数库中。

相关新闻

Qwen3.8-Max vs Kimi K3部署对比:API验证、开放权重与集群规划

Qwen3.8-Max vs Kimi K3部署对比:API验证、开放权重与集群规划

Qwen3.8-Max与Kimi K3都面向Coding、知识工作、多模态和长程Agent,也都公布了万亿级总参数和约1M Token上下文窗口。截至2026年8月5日,两款模型都可通过API开展业务验证,但可用于自托管评估的公开材料处于不同阶段。阿里云百炼当前已经列出模…

2026/8/6 8:22:56 阅读更多 →
Bullet Physics 三维碰撞检测:从原理到工程实践

Bullet Physics 三维碰撞检测:从原理到工程实践

1. 从“撞上”到“检测”:三维碰撞检测的工程意义 在三维虚拟世界里,一个角色能否走上台阶,一颗子弹能否击中目标,一辆赛车是否会撞上护栏,这些看似简单的交互背后,都依赖着一套复杂而精密的计算系统——三…

2026/8/6 8:22:56 阅读更多 →
PyTorch深度学习实验可视化:TensorBoard核心API详解与工程实践

PyTorch深度学习实验可视化:TensorBoard核心API详解与工程实践

1. 项目概述:为什么我们需要TensorBoard 在PyTorch项目里埋头苦干,调参、改网络结构、跑实验,一跑就是几个小时甚至几天。结果出来了,看着命令行里打印的一行行损失值和准确率,是不是总觉得少了点什么?没错…

2026/8/6 8:21:55 阅读更多 →

最新新闻

Windows自动备份方案:任务计划程序+PowerShell+Robocopy实战

Windows自动备份方案:任务计划程序+PowerShell+Robocopy实战

1. 为什么你需要一个自动备份方案? 如果你还在手动复制粘贴重要文件,或者指望自己每周五下午能记得去点一下备份按钮,那我得说,你的数据正走在一条危险的钢丝上。我见过太多因为一次系统崩溃、一次误删、甚至一次勒索病毒攻击&…

2026/8/6 9:23:32 阅读更多 →
软件逆向工程入门:从黑盒分析到实战破解

软件逆向工程入门:从黑盒分析到实战破解

1. 从“黑盒”到“白盒”:逆向工程究竟是什么? 如果你和我一样,最初听到“逆向工程”这个词,脑海里浮现的可能是电影里特工破解保险箱,或者黑客在屏幕上敲出一行行绿色代码的神秘场景。听起来很酷,但似乎离…

2026/8/6 9:23:32 阅读更多 →
NVIDIA Profile Inspector终极指南:免费解锁200+显卡隐藏设置

NVIDIA Profile Inspector终极指南:免费解锁200+显卡隐藏设置

NVIDIA Profile Inspector终极指南:免费解锁200显卡隐藏设置 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否知道你的NVIDIA显卡其实隐藏着200多项官方控制面板无法访问的高级设置&am…

2026/8/6 9:23:32 阅读更多 →
蓝桥杯单片机竞赛入门:IAP15F2K61S2开发板实战指南

蓝桥杯单片机竞赛入门:IAP15F2K61S2开发板实战指南

1. 项目概述:从零上手蓝桥杯单片机竞赛如果你正在准备蓝桥杯单片机设计与开发竞赛,或者刚拿到一块型号为IAP15F2K61S2的开发板,面对一堆资料和原理图感到无从下手,那么这篇内容就是为你准备的。我参加过多次这类竞赛的指导工作&am…

2026/8/6 9:23:32 阅读更多 →
第七史诗自动化助手终极指南:如何24小时自动刷书签与挂机讨伐

第七史诗自动化助手终极指南:如何24小时自动刷书签与挂机讨伐

第七史诗自动化助手终极指南:如何24小时自动刷书签与挂机讨伐 【免费下载链接】e7Helper 【Epic Seven Auto Bot】第七史诗多功能覆盖脚本(刷书签🍃,挂讨伐、后记、祭坛✌️,挂JJC等📛,多服务器支持&#x…

2026/8/6 9:23:32 阅读更多 →
客户端与服务器持续同步解析(轮询,comet,WebSocket)

客户端与服务器持续同步解析(轮询,comet,WebSocket)

客户端与服务器持续同步解析(轮询,Comet,WebSocket) 在现代 Web 应用中,实时数据同步(如消息推送、在线协作、股票行情)已成为核心需求。从最初的简单轮询到如今的 WebSocket,技术的…

2026/8/6 9:22:31 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →