对HTML标准的思考 - 记解决H5随机显示简繁体汉字问题

遇到问题

上个月在开发淘票票专业版过程中,我们遇到了一个奇怪的问题:

H5容器里的汉字被显示为一些奇怪的样子


首先:
1)这个问题不能准确复现,同型号同系统的两台 iPhone 6s Plus 有一台会出现;
2)不确定是否在 Android 上出现;
3)如果出现问题,重装 APP 则有可能恢复正常。

介绍下出问题的环境:

目前只在 iOS 系统中复现,H5 使用 Windvane 容器

真机不好调试,模拟器不能准确复现,暂时不知如何进行了。

跳进了一个坑

以为是简繁体问题,打开输入法看看繁体「票房」怎么写,似乎并不是繁体字:

直到项目进入了测试用例编写阶段,我发现 Aone 上能准确复现这个字体问题,如图。

马上打开 Chrome 进行调试,看到了一个陌生字体:AppleGothic

上字体网站预览 AppleGothic 效果:

确实和截图里的字体非常相似。知乎搜索 AppleGothic ,其中有一条:

/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/Resources/DefaultFontFallbacks.plist
对应日/韩/简/繁分别是 AquaHiraKaku/AppleGothic/STHeitiSC-Light/STHeitiTC-Light。

于是几天时间一直在搜索相关资料,仍然无解。

跳出坑

开始想到是 iOS 系统字体显示的优先级问题,在「设置-通用-语言与地区」可以看到。找到几台复现问题的机器查了显示顺序发现,首选语言均是「简体中文」、「繁体中文」、「English」,不太可能显示「韩文」。

到底哪里出了问题?

我又拿出截图逐个对比了下字体,很明显「排片」俩字的显示效果不一致:

问题仍然没解决。

定位问题

回到起点,几乎没有任何进展。

无奈,从代码层面分析:

影响文字显示的主要是:

  1. 系统语言与区域设置;
  2. 浏览器字体顺序设置;
  3. font-family 属性;
  4. lang 属性。

排除 1、2 不可改变因素,定位到第3、4点,发现问题:

其中第3点,我们选择 reset 的 CSS 重置方案,body 节点设置了:

font-family: 'Helvetica Neue', sans-serif;

字体栈设置了 Helvetica 和 「非衬线」字体族,如果是中文字体,Helvetica 默认 Fallback 到下一字体,而下一个字体 sans-serif 则根据系统设置进行渲染。iOS 系统里对于中文字体默认使用 「PingFang」,简体为「PingFang SC」,繁体为「PingFang TC」。

联系客户端同学帮忙查了下 APP 区域设置,默认为 en-US

这一点我不太确定:

「如果 html 文档没有设置语言区域,会从浏览器或系统环境取到当前所在区域的字体作为显示字体」

第4点,容器没有找到 lang ,且检测到当前环境为 en,而文档内容是「汉字」,则默认在「简」、「繁」的「PingFang」中选择,如:

font-family: 'Helvetica Neue', 'PingFang SC';
font-family: 'Helvetica Neue', 'PingFang TC';

预览「PingFang TC」字体:

确实完全匹配。

解决

上面提到的第 4 点,结合定位的 font-family 问题,主要有两种解决方案。

  1. 设置 lang
  2. 设置 PingFang SC

操作第二点,局限性比较大。因为仅针对一种字体进行设置,如果未来引入了新字体,则同样会出现这个问题;

我比较倾向于设置 lang 属性解决:更新 html 的 <html> 标签为 <html lang="cmn-Hans">,使浏览器默认使用普通话的简体中文作为显示语言进行渲染。

对于 lang 属性的最佳实践,可以参考:BCP 47

取值顺序:language-extlang-script-region-variant-extension-privateuse
来自:https://www.w3.org/International/articles/language-tags/

发布到预发环境下连续测试了一周,问题没有复现,基本可确定问题解决。

对于 lang 属性的设置,过去我们一直设置为 zh-cmn-Hans,查阅了 IANA

Type: redundant
Tag: zh-cmn-Hans
Description: Mandarin Chinese (Simplified)
Added: 2005-07-15
Deprecated: 2009-07-29
Preferred-Value: cmn-Hans

已被标记为「不推荐使用」,需要调整为「cmn-Hans」。如果为了兼容,可以加上「zh-」:「zh-cmn-Hans」

参考

  1. IANA language-subtag-registry
  2. IETF BCP 47
  3. W3C language-tags

时间: 2024-10-31 03:51:27

对HTML标准的思考 - 记解决H5随机显示简繁体汉字问题的相关文章

解决JSP中文显示问题的几个方法

js|解决|问题|显示|中文 解决JSP中文显示问题的几个方法 总结了以下几条方法: 1.在jsp页中加入一条语句: <%@ page contentType="text/html;charset=gb2312" %>中文显示就正常了. 2.对于从网页中的文本框通过String parameter = request.getParameter("parameter");方式获得的字符串,均是8859_1的编码,如果想把它显示在网页上就必须得用parame

cocos2d x-求解决动态loading显示问题

问题描述 求解决动态loading显示问题 我在做一个Loading界面的时候,用一个数组const char * str = {"Loading","Loading.","Loading..","Loading..."} bool Load::init() { if(!CCLayer::init()) { return false; } //这个方法用来每个一秒调用一次修改Loading,实现动态的一个效果 schedule

c#-C# web收银系统怎么解决顾客屏显示的问题

问题描述 C# web收银系统怎么解决顾客屏显示的问题 如题.很少的资料.请大牛门提供下思路与少量代码. 还想问一下顾客屏厂家不一样有什么关系没有. 解决方案 无非就是双显示器,每个显示器有自己的桌面,一个对着客户,显示它的信息.用winforms,不要用web. 解决方案二: 解决Ubuntu系统中文乱码显示问题

网页标准学习:关于web标准的思考

web|web标准|网页 我是从去年初开始学习web标准的,两年下来也有些心得.最近跳槽了正好闲在家里,写一些出来和大家交流一下. 1 对于web标准和W3C XHTML规范的理解 按照习惯的理解,这两个概念似乎都是指的一个东西(就是咱们在这个版里讨论的这些个"高深理论"^_^).但我认为,事实上从技术的角度上讲,这两个事物几乎没有任何相关性.web标准简而言之就是将页面的结构.表现和行为各自独立实现,更通俗的讲就是如今招聘时流行的语言"div+css".但W3C

一个想法(续二):换个角度思考如何解决IT企业招聘难的问题!

前言: 上一篇文章:一个想法:成立草根技术联盟对开发人员进行技术定级解决企业员工招聘难问题! 当时写文的思维,是从一个公益组织的角度的思考. 因此,有不少关于从利出发的反方观点,的确是值的思考! 任何的改革都需要平衡利益,否则都只剩下空谈~ 于是,我换了一个角度思考了这个问题,如果这是一个项目! 那问题就转化为: 解决什么问题? 如何解决问题? 项目如何盈利? 1:解决企业招聘难的问题: A:招聘周期长 新的公司:从组建团队到成型,往往需要花费几个月的时间. 老的公司:招聘周期也很长,花了时间,

关于web标准的思考

web|web标准 我是从去年初开始学习web标准的,两年下来也有些心得.最近跳槽了正好闲在家里,写一些出来和大家交流一下. 1 对于web标准和W3C XHTML规范的理解 按照习惯的理解,这两个概念似乎都是指的一个东西(就是咱们在这个版里讨论的这些个"高深理论"^_^).但我认为,事实上从技术的角度上讲,这两个事物几乎没有任何相关性.web标准简而言之就是将页面的结构.表现和行为各自独立实现,更通俗的讲就是如今招聘时流行的语言"div+css".但W3C XHT

标准布局常见问题及解决办法_经验交流

CSS2.0盒模型层次平面示意图和3D示意图 3像素问题及解决办法 当使用float浮动容器后,在IE6下会产生3px的空隙,有意思的是右侧容器没设置高度时3px在右侧容器内部,当设定高度后又跑到容器的左侧了,所以对布局精度要求高的话,请参考例29.31的解决方法 上边容器浮动后,下边的容器跟着浮动,造成页面错乱 如以上例子中的footer必须要单独占一行,但当sidebar浮动后,content的高度小于sidebar的高度时,footer也跟着浮动到sidebar右侧了,造成页面错乱.解决办

我的一些关于web标准的思考笔记(一)_经验交流

我是从去年初开始学习web标准的,两年下来也有些心得.最近跳槽了正好闲在家里,写一些出来和大家交流一下. 1 对于web标准和W3C XHTML规范的理解 按照习惯的理解,这两个概念似乎都是指的一个东西(就是咱们在这个版里讨论的这些个"高深理论"^_^).但我认为,事实上从技术的角度上讲,这两个事物几乎没有任何相关性.web标准简而言之就是将页面的结构.表现和行为各自独立实现,更通俗的讲就是如今招聘时流行的语言"div+css".但W3C XHTML的任何一个版本都

全球云计算标准局限 安全问题亟需解决

美国市场研究公司Gartner预测,到2013年,全球云计算产业规模将达到1000亿美元.如此庞大的数字,令不少人欢欣鼓舞,然而现实中云计算前进的步伐却如履簿冰.云计算仍是擂鼓多.应用少,安全问题更是使得应用如鲤在喉. 近期在某国际知名杀毒软件的交流会上,其发言人指出,随着WiFi.3G等局域网络的接入,每一端点都可以成为对外连接的窗口,使传统的网关失去了意义.因此须从端点安全保护来保护网络安全,打造复合型.立体式的保护网.面对海量的数据和层出不穷的病毒,信息云.安全云被委以重任,以应对风险,提