阿拉伯字符CID映射解码问题:字符替换错误与空格异常求助
阿拉伯字符CID映射解码问题修复
问题说明
使用提供的Python代码解码阿拉伯字符CID映射字符串时,出现字符替换错误、空格重复,且最终输出顺序完全不符合预期,正确输出应为جيهان عزت صقر عبد الحكم。
错误原因分析
- CID匹配逻辑缺陷:代码固定截取9个字符匹配CID,但部分CID(如
(cid:3))仅7个字符,导致匹配失败,后续字符偏移错误,替换失效。 - 空格重复添加:处理
(cid:3)时,既添加了映射的空格,又额外追加一个空格,导致空格数量翻倍。 - 反转逻辑错误:直接反转整个字符串会同时反转词内字符和词的顺序,破坏阿拉伯语书写规则——阿拉伯语需先将视觉顺序的词转为逻辑顺序(反转词内字符),再调整词的排列顺序。
- 字符映射形态错误:原映射使用了上下文相关的连写形态字符(如
ـا、هـ),这些字符无法由系统自动处理连写,导致显示异常。
修复后的代码
import re # 修正字符映射:使用标准阿拉伯字符,替换上下文相关的连写形态 char_code_mapping = { "(cid:993)": "م", "(cid:987)": "ك", "(cid:931)": "ح", "(cid:991)": "ل", "(cid:909)": "ا", "(cid:937)": "د", "(cid:913)": "ب", "(cid:971)": "ع", "(cid:941)": "ر", "(cid:984)": "ق", "(cid:955)": "ص", "(cid:917)": "ت", "(cid:943)": "ز", "(cid:997)": "ن", "(cid:910)": "ا", "(cid:1004)": "ه", "(cid:1011)": "ي", "(cid:927)": "ج", "(cid:3)": " ", } line = "(cid:993)(cid:987)(cid:931)(cid:991)(cid:909)(cid:3)(cid:937)(cid:913)(cid:971)(cid:3)(cid:941)(cid:984)(cid:955)(cid:3)(cid:917)(cid:943)(cid:971)(cid:3)(cid:997)(cid:910)(cid:1004)(cid:1011)(cid:927)" # 使用正则匹配所有CID格式字符串,避免固定长度匹配的缺陷 cid_pattern = re.compile(r'\(cid:\d+\)') cid_matches = cid_pattern.findall(line) # 解码得到视觉顺序的字符串 visual_text = ''.join([char_code_mapping.get(match, match) for match in cid_matches]) # 处理阿拉伯语顺序: # 1. 按空格分割成词 # 2. 反转每个词的字符,将视觉顺序转为逻辑顺序 # 3. 反转词列表,调整词的排列顺序以符合正确的显示逻辑 words = visual_text.split() logic_words = [word[::-1] for word in words] final_text = ' '.join(reversed(logic_words)) # 写入文件 output_path = "decoded_output.txt" with open(output_path, "w", encoding="utf-8") as f: f.write(final_text) print(f"解码后的阿拉伯文本已保存至 {output_path}")
修复说明
- 正则匹配CID:使用
re.compile(r'\(cid:\d+\)')匹配所有格式的CID,无论数字位数多少,确保全部正确捕获。 - 修正空格处理:仅保留映射中的单个空格,去掉额外添加的空格。
- 调整反转逻辑:先按空格分割词,反转每个词的字符(将视觉顺序转为逻辑顺序),再反转词列表,确保最终字符串的存储顺序符合阿拉伯语双向文本显示规则。
- 修正字符映射:替换上下文相关的连写形态字符为标准阿拉伯字符,由Unicode双向文本算法自动处理连写显示。
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

