如何在Python中将Preeti编码字体转Unicode并保留英文内容
问题:避免Preeti字体转Unicode时错误转换英文内容
我使用Python的npTTF2UTF库将Preeti字体文本转换为Unicode时,多数场景运行正常,但像Microwave这类英文单词会被错误转换为Unicode等效字符。希望仅转换Preeti字体的尼泊尔语文本,保留后续英文内容不做转换。
原代码及错误输出
原代码
import npttf2utf mapper = npttf2utf.FontMapper("npttf2utf-main/src/npttf2utf/map.json") text = ''' cGo g]6js{;Fu cfj4 x"g] :yfg, tl/sf / lsl;d like (Microwave/Satellite/Cable etc.) ''' # 原代码存在变量错误:word未定义,应为text converted_text = mapper.map_to_unicode(text, from_font="Preeti", unescape_html_input=False, escape_html_output=False) print(converted_text)
错误输出
अन्य नेटवर्कसँग आवद्ध हूने स्थान, तरिका र किसिम ष्पिभ ९ःष्अचयधबखभरक्बतभििष्तभरऋबदभि भतअ।०
解决方案
核心思路是将文本拆分为需要转换的Preeti片段和无需转换的英文片段,分别处理后再拼接。
方法1:固定拆分点处理
如果已知不需要转换的起始位置,直接按固定标记拆分文本:
import npttf2utf mapper = npttf2utf.FontMapper("npttf2utf-main/src/npttf2utf/map.json") text = ''' cGo g]6js{;Fu cfj4 x"g] :yfg, tl/sf / lsl;d like (Microwave/Satellite/Cable etc.) ''' # 以'lsl;d '作为拆分标记,将文本分为Preeti部分和英文部分 split_marker = 'lsl;d ' preeti_part, english_part = text.split(split_marker, 1) # 转换Preeti部分(保留拆分标记的核心内容) converted_preeti = mapper.map_to_unicode(preeti_part + split_marker.strip(), from_font="Preeti", unescape_html_input=False, escape_html_output=False) # 拼接转换后的内容与原英文部分 final_text = converted_preeti + ' ' + english_part print(final_text)
方法2:自动识别脚本拆分(通用方案)
如果拆分点不固定,可通过字符范围自动区分Preeti字符与英文:
import npttf2utf mapper = npttf2utf.FontMapper("npttf2utf-main/src/npttf2utf/map.json") text = ''' cGo g]6js{;Fu cfj4 x"g] :yfg, tl/sf / lsl;d like (Microwave/Satellite/Cable etc.) ''' def is_preeti_char(c): # 根据npTTF2UTF的映射表,Preeti字符多为ASCII特殊符号/标点,可根据实际映射调整 return not c.isalnum() or c in '[]{};:/"\',()' def split_text_by_script(text): preeti_segments = [] english_segments = [] current_segment = [] current_is_preeti = None for c in text: is_preeti = is_preeti_char(c) if current_is_preeti is None: current_is_preeti = is_preeti current_segment.append(c) elif is_preeti == current_is_preeti: current_segment.append(c) else: # 切换脚本类型,保存当前片段 if current_is_preeti: preeti_segments.append(''.join(current_segment)) else: english_segments.append(''.join(current_segment)) current_is_preeti = is_preeti current_segment = [c] # 处理最后一段 if current_segment: if current_is_preeti: preeti_segments.append(''.join(current_segment)) else: english_segments.append(''.join(current_segment)) return preeti_segments, english_segments # 拆分文本并分别处理 preeti_parts, english_parts = split_text_by_script(text) converted_preeti_parts = [ mapper.map_to_unicode(part, from_font="Preeti", unescape_html_input=False, escape_html_output=False) for part in preeti_parts ] # 按原顺序拼接所有片段 final_segments = [] p_idx = e_idx = 0 # 交替添加Preeti和英文片段(按原文本出现顺序) while p_idx < len(converted_preeti_parts) or e_idx < len(english_parts): if p_idx < len(converted_preeti_parts): final_segments.append(converted_preeti_parts[p_idx]) p_idx += 1 if e_idx < len(english_parts): final_segments.append(english_parts[e_idx]) e_idx += 1 final_text = ''.join(final_segments) print(final_text)
内容的提问来源于stack exchange,提问作者Pratik Dhakal
相关产品推荐
相关产品推荐

