Flutter for OpenHarmony:diacritic 移除重音符号,实现精准的模糊搜索与排序(文本规范化处理) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:diacritic 移除重音符号,实现精准的模糊搜索与排序(文本规范化处理) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

前言

全球化应用经常需要处理包含各种重音符号(Accent)和变音符号(Diacritic)的文本,如法语的 “café”、德语的 “München” 或西班牙语的 “mañana”。如果不进行处理,用户在搜索 “cafe” 时可能搜不到 “café”,导致体验极差。

diacritic 是一个专注于解决此类问题的轻量级 Dart 库。它能在几乎不损失语义的情况下,将这些字符转换为其最接近的 ASCII 形式。本文将介绍如何在 OpenHarmony 应用中利用它优化搜索和排序体验。

一、diacritic 简介

1.1 核心功能

  • 移除变音符号:将 à, é, î, ö 等转换为 a, e, i, o
  • 保持语义:尽量寻找视觉或发音相似的替代字符。

1.2 OpenHarmony 适配说明

diacritic 完全用 Dart 编写,无任何平台依赖。它在 OpenHarmony 设备上的运行效果与全平台一致,且性能极快。

用户输入: München

移除变音符

规范化后: Munchen

搜索数据库

命中结果

二、集成与基础用法

2.1 添加依赖

dependencies:diacritic: ^0.1.6 

2.2 基础转换

import'package:diacritic/diacritic.dart';voidmain(){// 1. 简单替换print(removeDiacritics('café'));// 输出: cafeprint(removeDiacritics('München'));// 输出: Munchenprint(removeDiacritics('Åland'));// 输出: Aland// 2. 混合字符print(removeDiacritics('Héllo Wörld!'));// Hello World!}

三、常见应用场景与示例

3.1 示例一:实现模糊搜索

最常见的场景是做一个忽略重音的搜索功能。

import'package:diacritic/diacritic.dart'; bool searchMatch(String query,String text){// 将查询词和目标文本都规范化为无变音符号的小写形式final normalizedQuery =removeDiacritics(query.toLowerCase());final normalizedText =removeDiacritics(text.toLowerCase());return normalizedText.contains(normalizedQuery);}voidtestSearch(){const dataset =['Sèvres','Céline','Åland','München'];const query ='sev';// 用户输入 "sev"final results = dataset.where((item)=>searchMatch(query, item)).toList();print(results);// [Sèvres]}
在这里插入图片描述

3.2 示例二:各种语言人名排序

直接对包含特殊字符的字符串列表排序往往不符合用户预期。规范化后再排序通常更自然。

import'package:diacritic/diacritic.dart';voidsortNames(){final names =['Élodie','Ezra','Ève','Adam'];// 按照规范化后的字符串排序 names.sort((a, b){returnremoveDiacritics(a).compareTo(removeDiacritics(b));});print(names);// [Adam, Élodie, Ève, Ezra] (E开头的名字现在聚合在一起了)}
在这里插入图片描述

3.3 示例三:生成 URL Slug

将文章标题转换为 URL 友好的格式。

import'package:diacritic/diacritic.dart';StringgenerateSlug(String title){// 1. 移除变音符号var slug =removeDiacritics(title);// 2. 转换为小写 slug = slug.toLowerCase();// 3. 替换非字母数字字符为连字符 slug = slug.replaceAll(RegExp(r'[^a-z0-9]'),'-');// 4. 去除多余连字符 slug = slug.replaceAll(RegExp(r'-+'),'-').trim();return slug;}voidtestSlug(){print(generateSlug('Café & Crème: A Review'));// 输出: cafe-creme-a-review}
在这里插入图片描述

四、完整实战示例:国际化城市搜索

本示例展示一个 OpenHarmony 搜索界面。列表包含世界各地的城市名,用户即便输入不带重音的字符也能精准匹配。

4.1 示例代码

import'package:flutter/material.dart';import'package:diacritic/diacritic.dart';voidmain(){runApp(constMaterialApp(home:CitySearchPage()));}classCitySearchPageextendsStatefulWidget{constCitySearchPage({super.key});@overrideState<CitySearchPage>createState()=>_CitySearchPageState();}class _CitySearchPageState extendsState<CitySearchPage>{// 模拟数据源finalList<String> _allCities =['Zürich','München','São Paulo','Montréal','Bogotá','Curaçao','New York','Paris',];List<String> _filteredCities =[];finalTextEditingController _controller =TextEditingController();@overridevoidinitState(){super.initState(); _filteredCities = _allCities;// 初始显示全部 _controller.addListener(_onSearchChanged);}@overridevoiddispose(){ _controller.removeListener(_onSearchChanged); _controller.dispose();super.dispose();}void_onSearchChanged(){final query = _controller.text;setState((){if(query.isEmpty){ _filteredCities = _allCities;}else{// 核心过滤逻辑 _filteredCities = _allCities.where((city){final normalizedCity =removeDiacritics(city).toLowerCase();final normalizedQuery =removeDiacritics(query).toLowerCase();return normalizedCity.contains(normalizedQuery);}).toList();}});}@overrideWidgetbuild(BuildContext context){returnScaffold( appBar:AppBar(title:constText('Diacritic Search Demo')), body:Column( children:[Padding( padding:constEdgeInsets.all(16.0), child:TextField( controller: _controller, decoration:constInputDecoration( labelText:'搜索城市 (如 munchen, sao paulo)', prefixIcon:Icon(Icons.search), border:OutlineInputBorder(),),),),Expanded( child:ListView.builder( itemCount: _filteredCities.length, itemBuilder:(context, index){final city = _filteredCities[index];returnListTile( leading:constIcon(Icons.location_city), title:Text(city), subtitle:Text('Original: $city -> Normalized: ${removeDiacritics(city)}'),);},),),],),);}}
在这里插入图片描述

五、总结

diacritic 虽然功能单一,但却是提升多语言应用用户体验的利器。在 OpenHarmony 平台上,它无需任何特殊配置即可开箱即用。

最佳实践

  1. 搜索优化:始终在后台对索引和查询词同时应用 removeDiacritics
  2. 数据清洗:在保存用户输入到数据库前,如果主要用于标识用途(如 username slug),建议清理。
  3. 保持原样显示:只在逻辑处理时转换,UI 上仍应展示原始的 München 以尊重用户习惯。

Read more

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建 作者:高瑞冬 本文目录 * AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建 * 一、MCP协议简介 * 二、创建MCP工具集 * 1. 获取MCP服务地址 * 2. 在FastGPT中创建MCP工具集 * 三、测试MCP工具 * 四、AI模型调用MCP工具 * 1. 调用单个工具 * 2. 调用整个工具集 * 五、私有化部署支持 * 1. 环境准备 * 2. 修改docker-compose.yml文件 * 3. 修改FastGPT配置 * 4. 重启服务 * 六、使用MCP-Proxy集成多个MCP服务 * 1. MCP-Proxy简介 * 2. 安装MCP-Proxy * 3. 配置MCP-Proxy * 4. 将MCP-Proxy与FastGPT集成 * 5. 高级配置

By Ne0inhk
【大模型实战篇】基于Claude MCP协议的智能体落地示例

【大模型实战篇】基于Claude MCP协议的智能体落地示例

1. 背景         之前我们在《MCP(Model Context Protocol) 大模型智能体第一个开源标准协议》一文中,介绍了MCP的概念,虽然了解了其概念、架构、解决的问题,但还缺少具体的示例,来帮助进一步理解整套MCP框架如何落地。         今天我们基于claude的官方例子--获取天气预报【1】,来理解MCP落地的整条链路。 2. MCP示例         该案例是构建一个简单的MCP天气预报服务器,并将其连接到主机,即Claude for Desktop。从基本设置开始,然后逐步发展到更复杂的使用场景。         大模型虽然能力非常强,但其弊端就是内容是过时的,这里的过时不是说内容很旧,只是表达内容具有非实时性。比如没有获取天气预报和严重天气警报的能力。因此我们将使用MCP来解决这一问题。         构建一个服务器,该服务器提供两个工具:获取警报(get-alerts)和获取预报(get-forecast)。然后,将该服务器连接到MCP主机(在本例中为Claude for Desktop)。         首先我们配置下环

By Ne0inhk
AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

云边有个稻草人-ZEEKLOG博客 目录 引言 一、什么是DeepSeek? 1.1 DeepSeek平台概述 1.2 DeepSeek的核心功能与技术 二、蓝耘通义万相2.1概述 2.1 蓝耘科技简介 2.2 蓝耘通义万相2.1的功能与优势 1. 全链条智能化解决方案 2. 强大的数据处理能力 3. 高效的模型训练与优化 4. 自动化推理与部署 5. 行业专用解决方案 三、蓝耘通义万相2.1与DeepSeek的对比分析 3.1 核心区别 3.2 结合使用的优势 四、蓝耘注册流程 五、DeepSeek与蓝耘通义万相2.1的集成应用 5.1 集成应用场景 1. 智能医疗诊断

By Ne0inhk
基于腾讯云HAI + DeepSeek快速设计自己的个人网页

基于腾讯云HAI + DeepSeek快速设计自己的个人网页

前言:通过结合腾讯云HAI 强大的云端运算能力与DeepSeek先进的 AI技术,本文介绍高效、便捷且低成本的设计一个自己的个人网页。你将了解到如何轻松绕过常见的技术阻碍,在腾讯云HAI平台上快速部署DeepSeek模型,仅需简单几步,就能获取一个包含个人简介、技能特长、项目经历及联系方式等核心板块的响应式网页。 目录 一、DeepSeek模型部署在腾讯云HAI 二、设计个人网页 一、DeepSeek模型部署在腾讯云HAI 把 DeepSeek 模型部署于腾讯云 HAI,用户便能避开官网访问限制,直接依托腾讯云 HAI 的超强算力运行 DeepSeek-R1 等模型。这一举措不仅降低了技术门槛,还缩短了部署时间,削减了成本。尤为关键的是,凭借 HAI 平台灵活且可扩展的特性,用户能够依据自身特定需求定制专属解决方案,进而更出色地适配特定业务场景,满足各类技术要求 。 点击访问腾讯云HAI控制台地址: 算力管理 - 高性能应用服务 - 控制台 腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力,只需简单的几步就能调用DeepSeek - R1

By Ne0inhk