Android TextView使用GT Haptik字体时ATM显示为商标符号,如何解决?
解决方案:Android TextView 中GT Haptik字体自动转换TM为商标符号的问题
这个问题的核心是GT Haptik字体内置了**连字(Ligatures)**规则,Android TextView默认开启了字体连字解析,所以会把连续的"TM"替换成商标符号;而Microsoft Office默认没有启用这类特定连字,所以不会出现这个问题。
下面是几种可行的解决办法:
禁用TextView的字体连字功能
这是最直接的方案,通过关闭连字解析来阻止自动替换:- 在XML布局中设置:
<TextView android:id="@+id/tv_example" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ATM" android:fontFeatureSettings="'liga' off" /> - 或者在代码中动态设置(Kotlin):
val originalTypeface = Typeface.createFromAsset(assets, "GT-Haptik.ttf") val noLigatureTypeface = Typeface.Builder(originalTypeface) .setFontFeatureSettings("'liga' off") .build() textView.typeface = noLigatureTypeface - Java版本:
Typeface originalTypeface = Typeface.createFromAsset(getAssets(), "GT-Haptik.ttf"); Typeface noLigatureTypeface = new Typeface.Builder(originalTypeface) .setFontFeatureSettings("'liga' off") .build(); textView.setTypeface(noLigatureTypeface);
- 在XML布局中设置:
手动拆分文本规避连字
如果不想修改字体配置,可以在"TM"之间插入零宽空格(Unicode编码\u200B),比如将文本"ATM"改为"AT\u200BM"。这样视觉上不会有额外空格,但TextView不会将其识别为连字序列,也就不会替换成商标符号。修改字体文件的连字规则
如果你有权限编辑字体文件,可以用FontForge这类字体编辑工具打开GT Haptik字体,找到对应"TM"的连字条目并删除,重新导出字体后再引入项目使用。这种方式一劳永逸,不需要修改代码。
内容的提问来源于stack exchange,提问作者Yanay Lehavi
相关产品推荐
相关产品推荐

