Flutter多语言适配时字符串打印一致但contains匹配失败如何解决?
多语言RTL场景下字符串匹配异常解决方案
很多开发者在开发支持多语言(尤其阿拉伯语等从右到左书写的RTL语言)的应用时,可能会遇到搜索结果不符合预期的问题,典型现象如下:
print(listOfName.contains(InputName)); // 输出 false
明明打印时两个字符串内容完全相同,但contains方法却返回false。
要解决该问题,可先对搜索字符串和目标字符串分别编码后对比,就能发现字符串中被额外插入了不可见特殊字符。常见的多余字符为RTL标记(UTF-8编码对应[226, 128, 143])和LTR标记(UTF-8编码对应[226, 128, 142]),可通过以下方法清除后再进行匹配:
var InputNameEncode = InputName.encode; var rightToLeftMark = utf8.decode([226, 128, 143]); var leftToRightMark = utf8.decode([226, 128, 142]); InputNameEncode = InputNameEncode.replaceAll(rightToLeftMark, ""); InputNameEncode = InputNameEncode.replaceAll(leftToRightMark, ""); inputName = InputNameEncode.decode; print(listOfName.contains(InputName)); // 输出 true
上述案例中多余的是RTL和LTR不可见标记,如果你遇到的问题由其他类型特殊字符导致,可自行查询UTF-8编码表确认对应字符含义后按相同逻辑处理。
适配环境:Flutter Version: 1.22.6
内容的提问来源于stack exchange,提问作者Lawati97
相关产品推荐
相关产品推荐

