在.NET C#中如何正确解析阿拉伯文本字符串的每个字符
C# 阿拉伯语字符串索引错位问题修复方案
问题根因
- C# 中直接使用
string[index]索引取值,基于 UTF-16 代码单元定位,并非用户视觉上可感知的单个「文本元素」,阿拉伯语部分复杂字符由多个代码单元组成,直接索引会出现取值错位。 - 阿拉伯语属于从右到左(RTL)书写体系,字符的视觉展示顺序和内存中存储的逻辑顺序相反,直接按视觉顺序数下标取值必然和预期不符。你当前取到的
ٻ是阿拉伯语片段逻辑顺序的首位字符,对应视觉上阿拉伯语片段的最右侧位置,和你预期的视觉位置错位。
正确处理方法
如果要按视觉感知的字符顺序遍历、取指定位置的字符,使用 System.Globalization.StringInfo 类处理文本元素即可:
示例代码
using System.Globalization; // 你的业务字符串 string targetStr = "Arabic text: ٻڠڣڟگگښڏ"; StringInfo strInfo = new StringInfo(targetStr); // 1. 获取字符串视觉可见的总字符数 int totalVisualCharCount = strInfo.LengthInTextElements; // 2. 取指定位置的视觉字符(下标从0开始,示例取第13位则传12) string expectChar = strInfo.SubstringByTextElements(12, 1); // 3. 正确遍历所有视觉可见字符 for (int i = 0; i < strInfo.LengthInTextElements; i++) { string currentVisualChar = strInfo.SubstringByTextElements(i, 1); // 业务逻辑处理 }
补充说明
如果需要完全匹配从右到左的视觉顺序取阿拉伯语部分的字符,提取出阿拉伯语片段的文本元素列表后,反转列表再按索引取值即可。不要用 char 类型接收阿拉伯语单个字符,部分复杂阿拉伯字符会占用2个char的存储空间,用string类型接收单个文本元素更稳妥。
内容的提问来源于stack exchange,提问作者abenci
相关产品推荐
相关产品推荐

