You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:25:24