缅甸语网页在七年里换掉了一整套字节,当年那批旧页面今天一条都打不开

缅甸语网页在七年里换掉了一整套字节,当年那批旧页面今天一条都打不开
张文保 33 分钟阅读 2,369 阅读
本文目录
  1. 一门语言的网页换掉了一整套字节,这件事今天还剩下什么?
  2. 一家做离网太阳能的站,缅甸语页面在两拨用户眼里长得不一样
  3. 差别在那位同事的电脑上装了一套字体
  4. 还有第二个坑,藏在历史内容里
  5. 先说清楚这不是乱码问题
  6. 这套非标准编码是怎么来的
  7. 值得说一句:当年选它的人没有做错
  8. 为什么它能赢,以及赢了多久
  9. 这一层归语言层管,边界在哪
  10. 两套编码的差别,落到码位上到底差在哪?
  11. 拿五个词逐个摊开
  12. 第一类:只差一个码位,肉眼几乎看不出
  13. 第二类:码位数不一样,还借用了别人的地盘
  14. 第三类:顺序反了
  15. 把这三类放在一起看
  16. 今天还有多少缅甸站在用旧编码?
  17. 实验怎么做的
  18. 结果
  19. 先别急着下结论,这个样本有偏
  20. 顺手捞到的一条:样式表里还留着字体族名
  21. 另一个意外:一半的缅甸站首页没有缅文
  22. 把时间轴倒回去,这条迁移曲线长什么样?
  23. 用同一个模型跑历史快照
  24. 曲线
  25. 断崖落在哪里
  26. 逐站看,换边发生在哪一年
  27. 有意思的是那几个从来没换过边的站
  28. 那批旧页面去哪了?
  29. 这个实验的结果超出预期
  30. 21比0是什么概念
  31. 这个对照必须说清楚它有多弱
  32. 为什么这句话对做站的人仍然重要
  33. 这笔存量账怎么自己查一遍
  34. 用户那一侧呢,搜索框里打进去的是哪一套字节?
  35. 站点全换完了,不等于用户全换完了
  36. 结果
  37. 第五组那个反例才是这一节的重点
  38. 四组零、一组反例,该怎么读
  39. 顺带一个提醒:这个实验会随时间失效
  40. 这对进入这个市场的人意味着什么?
  41. 三条结论,按确定性排序
  42. 第三条的反面
  43. 什么情况下值得单独做
  44. 什么情况下不值得
  45. 缅甸语还有哪几层跟编码无关但同样会咬人的问题?
  46. 第一层:没有空格
  47. 第二层:字节重,视觉字符少
  48. 第三层:字符堆叠,行高不够就糊
  49. 第四层:字体
  50. 第五层:数字有两套写法
  51. 第六层:审校和工具资源都要自己兜底
  52. 一套两天能跑完的缅甸语编码体检
  53. 第一天上午:判自己站上的字节
  54. 第一天下午:判进来的字节
  55. 第二天上午:字符层的常规项
  56. 第二天下午:语言层
  57. 开头那家太阳能站后来改了四处
  58. 三种看着稳妥、实际会留后患的做法
  59. 第一种:为了保险,两套编码都发一份
  60. 第二种:找一个在线转换工具,把老内容批量转一遍
  61. 第三种:把这件事当成一次性任务做完就归档
  62. 还有一个提醒:别把这套结论搬到别的语言上
  63. 常见问题解答
  64. 现在做缅甸语站,还需要考虑旧编码吗?
  65. 两套编码肉眼真的看不出来吗?
  66. 为什么说这不是普通的乱码?
  67. 那条从三分之二掉到零的曲线,能证明是官方迁移日起的作用吗?
  68. 2019年之前那批缅甸语老页面今天真的全没了吗?
  69. 缅甸语值不值得做,判断依据是什么?
  70. 怎么判断另一门语言有没有同样的编码分叉?
  71. 权威参考资料

摘要:缅甸语的网页在2016到2021年之间整体换了一套字节。保哥用官方检测模型跑了50个缅甸语站点,今天一个旧编码都找不到了;再把时间轴倒回去,旧编码的占比从2016年的三分之二一路掉到2021年的零。真正的账在后面:当年用旧编码写的那21个页面,今天一条都打不开。

一门语言的网页换掉了一整套字节,这件事今天还剩下什么?

一家做离网太阳能的站,缅甸语页面在两拨用户眼里长得不一样

有个客户做离网太阳能,主力是太阳能板、控制器、蓄电池和一体化照明套件,客户以农村家庭和小商铺为主。

泰国和越南做了两年多,路子摸熟了,往缅甸延伸是顺理成章的一步——这个市场的电网覆盖不全,离网设备是刚需,竞争也稀薄。

建站找的是本地服务商,理由很充分:本地团队懂本地用户,模板现成,上线快。

缅甸语版上线四个月,自然流量几乎是零。团队请了一位缅甸同事看页面,对方的第一句反馈是:字是错的。

可团队自己打开是正常的,两个人对着同一个网址各自截图,截出来的东西不一样。

差别在那位同事的电脑上装了一套字体

本地服务商给的模板里,样式表指定了一个字体族名,那是当年那套非标准字体的名字。

内容本身是标准编码写的——这一点没错,翻译交付的时候用的就是标准输入法。

问题是那套字体按非标准编码的码位分配来摆字形。用它去渲染标准编码的文本,每一个字符都会被摆到错误的位置上。

装了那套字体的人看到的是一堆错位的笔画,没装的人看到的是正常缅文。

团队所有人的电脑都没装,那位缅甸同事的电脑上装了,因为他还在用一部老手机同步过来的字体配置。

还有第二个坑,藏在历史内容里

这个站还做了一件很自然的事:把本地服务商手上的一批旧内容导了进来,充实分类页。

那批内容是2017年前后写的,用的是非标准编码。导进库之后,页面上看着没问题,因为它们配的正好是那套字体。

于是这个站同时存在两套字节:新内容是标准编码,老内容是非标准编码,而搜索引擎把它们当成两门语言在处理。

本站讲字最少的那几类页面最容易被机器认成另一门语言那一篇里说过,机器不完全相信你写在页面上的语言声明,它会自己数字符。这个站给它数出来的是一堆认不出来源的字节。

这两个坑加起来,就是本篇要拆开讲的那件事的两种典型形态:一个是字体和字节对不上,一个是站内两套字节并存。

先说清楚这不是乱码问题

做小语种站的人对乱码不陌生。页面没声明编码、数据库排序规则配错、导出的表格用错了字符集,这几类问题本站在词表被表格工具改坏那一篇里写过完整的排查路径。

缅甸语这一件不属于那一类。

它的形态是:页面的字符集声明是对的,字节是合法的UTF-8,浏览器不报任何错,屏幕上的字看着也是缅文。可这串字节和标准里规定的那串,不是同一串。

换句话说,不是编码坏了,是这门语言曾经有过两套互不兼容的编码同时在跑,而且用得多的那一套不是标准那一套。

这套非标准编码是怎么来的

缅文进Unicode很早,可早期系统对缅文的渲染支持一直跟不上——这门文字的字符要上下堆叠、要根据前后文换形,渲染引擎不支持的话,标准编码写出来的字在屏幕上就是散的。

于是本地做了一套字体,绕开渲染引擎,把每一个可能出现的字形单独占一个码位,靠字体自己摆位置。这样在任何一台不支持复杂文字渲染的机器上,缅文都能正常显示。

它占用的码位范围跟标准是同一段。Unicode官方那份缅甸文常见问题里把这件事写得很直白:两套编码使用同一个码位区间,而非Unicode的字体给同一个字符的不同部件分配了多达8个码位。

同一份区间,两套分配方案,谁也不知道对方在。这就是问题的全部。

值得说一句:当年选它的人没有做错

今天回头看很容易得出一个结论:本地人图省事,绕开标准,结果给所有人留了个坑。

这个结论不公平。

标准编码要能正常显示,前提是渲染引擎支持复杂文字整形。这个前提在2010年前后的低价安卓机上根本不成立,而那批机器就是缅甸绝大多数人上网的全部工具。

摆在当时的选择是:按标准写,一半用户看到的是散架的字;按那套字体写,所有人都能看。

换成谁都会选后者。这套编码不是偷懒的产物,是一个在当时条件下唯一能跑通的工程方案。

它变成问题,是因为条件后来变了而它没退场。这个结构在小语种里很常见——本站讲网站上所有的字都是给用户读的、只有域名这一串要他自己打出来那一篇里也有同一个形状:一条链上的支持程度永远由最弱的那一环说了算,而最弱那一环会随时间移动。

为什么它能赢,以及赢了多久

它赢是因为它解决了当下的问题。2010年前后缅甸开始大规模上网,手机是主要入口,而那批手机的系统渲染能力很弱。

用户装一个字体就能看见缅文,不装就是一屏方块,这个选择没有悬念。

结果是整整一代缅甸语的网页内容、社交内容、聊天记录,都是用这套非标准编码写的。

官方的迁移日定在2019年10月1日。本篇后面第四节会给出保哥自己测的那条曲线,它跟这个日期的关系比预想的有意思。

这一层归语言层管,边界在哪

先把不归本篇管的交出去。

页面怎么声明字符集、数据库用什么排序规则、CDN怎么处理内容类型,这些是通用工程问题,换任何一门语言都一样。

本篇要处理的是把语种换成英语就不存在的那一半:同一句缅甸语,在两套编码下是两串完全不同的字节,而搜索引擎匹配的是字节。用户打进搜索框的那一串跟你页面上那一串对不上,就等于你不在。

这一层跟本站写过的西里尔页面在Windows-1251时代的编码遗留是同族但不同种。那一篇讲的是UTF-8之前的八位编码,属于历史阶段的正常残留;缅甸语这一件发生在UTF-8之内,两套方案都是合法的UTF-8字节流,工具层面一个警告都不会给你。

两套编码的差别,落到码位上到底差在哪?

拿五个词逐个摊开

保哥把五个日常词的两种写法逐个打印了码位序列,差异分成三类,一类比一类狠。

第一类:只差一个码位,肉眼几乎看不出

手机这个词,两套编码都是5个码位、15个字节,长度完全一样。

差别只在第4个码位上:标准那一套用的是止音符号U+103A,非标准那一套用的是叠写符号U+1039。

这两个字符在屏幕上渲染出来的形状极其接近,把两个词并排放在一起,不懂缅文的人看不出区别,懂缅文的人也得盯一会儿。

可对搜索引擎来说,这是两个不同的字符串,交集为零。

第二类:码位数不一样,还借用了别人的地盘

价格这个词,标准那一套是9个码位27个字节,非标准那一套是8个码位24个字节。

少掉的那一个是因为非标准编码把两个字符合成了一个预置字形,而那个预置字形占的码位是U+108F和U+1088。

这两个码位在Unicode标准里不是缅甸语的,是分给掸语的。也就是说,一段缅甸语文本里会混着标准分配给另一门语言的字符。

本站讲波斯语和阿拉伯语共用一套字母那一篇里有一段讲同一个词两套码位怎么在索引里对齐,机制类似但成因不同:那边是两门语言的字符长得一样,这边是一套字体擅自占用了另一门语言的码位。

第三类:顺序反了

这一类最彻底。缅甸这个词本身就是样本。

标准那一套的码位序列是辅音在前、介音在后,遵循的是逻辑顺序,渲染引擎负责把介音摆到辅音左边去显示。

非标准那一套直接按视觉顺序存:介音在前、辅音在后,字体不需要做任何重排。

两串字节的第一个字符就不一样,长度还都是6个码位18个字节。

这一类的杀伤力在于它连前缀匹配都救不了。前两类至少还有共同的开头,第三类连起手式都是反的。

把这三类放在一起看

差异类型样本词码位数能不能靠前缀匹配捞回来
单码位替换手机5对5能捞回一部分
码位数不同、占用他语码位价格9对8基本捞不回
存储顺序相反缅甸6对6完全捞不回

保哥用官方检测模型对这五组词各跑了一遍,标准写法的判定值全是0.000,非标准写法全是1.000,没有一组落在中间。

这个干净程度本身说明一件事:两套编码在统计特征上分得很开,机器判起来不难。难的是没人告诉你需要判。

今天还有多少缅甸站在用旧编码?

实验怎么做的

判定工具用的是Google开源的缅甸文编码检测库。它不是规则匹配,是一个在缅甸语、掸语、孟语、克伦语和巴利语的双编码语料上训练出来的统计模型,给一段文本返回一个0到1的判定值。

官方给的阈值建议是两个:要少漏判就用0.05,要少误判就用0.95。保哥两个都用了,超过0.95判非标准,低于0.05判标准,中间的单独归一档叫不确定。

站点清单是50个,涵盖新闻媒体、政府部门、银行、电信运营商、招聘、房产、二手车、超市、影音、维基百科。抓首页,剥掉脚本和样式,只把缅文密度足够的段落丢给模型。

结果

50个站里,能抓到并且缅文量足够判定的有16个。

这16个站的判定结果是:标准编码16个,非标准编码0个,不确定0个

不是一边倒,是根本没有另一边。

剩下34个的情况分三类:抓取失败14个,主要是域名失效、证书问题和拒绝访问;首页压根没有缅文的18个,这一类几乎全是电商和企业站,它们的首页是英文;剩下2个缅文量太少不足以判定。

先别急着下结论,这个样本有偏

16个能判定的站里,媒体和政府占了大半。这两类恰恰是最早完成迁移的。

更长尾的那一层——个体商户的页面、社交平台上的内容、聊天记录、本地论坛——这次一个都没测到,因为它们要么不在开放网页上,要么抓不到。

所以这个结果只能支持一句话:今天在开放网页上还能被抓取到的缅甸语内容,基本全部是标准编码

它不能支持另一句话:缅甸用户的设备上已经没有旧编码了。这两句话差得很远,第六节会用另一个实验去碰后面那句。

顺手捞到的一条:样式表里还留着字体族名

抓页面的时候保哥顺手把每个站样式表里出现的字体族名也扒了一遍,专门找那几个跟缅文有关的名字。

扒出来的结果不多,但方向很清楚:还在被显式指定的是标准编码时代的那几套开源缅文字体,那套非标准字体的名字在这16个站上一次都没出现。

这跟开头那个太阳能站的情况正好构成对照——大站早就把它清干净了,本地服务商的模板里还留着。

所以这一项值得单独列进体检清单:全站搜一遍字体族名,比判编码还快,一分钟能查完,而它能抓到的是编码判定抓不到的那一类问题——字节是对的,字体是错的。

另一个意外:一半的缅甸站首页没有缅文

18个站首页缅文字符数为零,这个数字比编码结果本身更值得看。

它们不是没做本地化,而是首页做的是英文,缅文内容在内页或者干脆在社交平台上。

这跟本站讲在非洲选语种别先看人口那一篇里的承载度判据能对上:一门语言能不能承载页面,看的不是有多少人说它,看的是有没有人拿它写价格和退货政策。缅甸语这一层的供给密度,比人口数暗示的要薄。

把时间轴倒回去,这条迁移曲线长什么样?

用同一个模型跑历史快照

今天的结果是一个点,一个点画不出曲线。

保哥的做法是从网页存档里取同一批站在2016年6月、2018年6月、2019年12月和2021年6月的原始快照,用同一个模型再判一遍。

取的是不加改写的原始存档,避免存档系统自己注入的内容干扰判定。

曲线

时间非标准编码标准编码有效样本非标准占比
2016年6月63966.7%
2018年6月551050.0%
2019年12月27922.2%
2021年6月0770%
2026年8月016160%

2016年三分之二的站在用非标准编码,2018年打成平手,2019年底掉到五分之一出头,2021年归零。

断崖落在哪里

掉得最狠的一段是2018年6月到2019年12月,从50%掉到22.2%。

官方定的迁移日是2019年10月1日,正好卡在这一段里。

这个吻合度很高,但保哥不打算把它写成因果。理由有两条:样本只有九到十个站,一个站换边就是十个百分点;而且迁移这件事在官方定日期之前就已经在推进,2018年那一批标准编码站不是一夜之间冒出来的。

能说的是:这条曲线的形状跟一次有组织的迁移是吻合的,而不是自然演化的形状。自然演化不会在一年半里掉掉一半。

逐站看,换边发生在哪一年

站点类型201620182019底2021
国际广播机构缅文频道标准标准标准标准
缅甸语维基百科标准标准标准标准
本地影音站标准标准标准标准
独立媒体A非标准标准标准标准
独立媒体B非标准非标准标准缅文过少
广播机构B非标准非标准标准标准
房产平台非标准非标准非标准标准
娱乐媒体非标准非标准非标准无快照
日报非标准非标准缅文过少无快照

这张表比那条汇总曲线更能说明问题。

换边的时间不是齐刷刷的,从2016年到2021年拉开了整整五年,最早的一批在官方定日期之前三年就换完了,最晚的一批拖到日期之后将近两年。

而且换边的顺序有规律:国际机构最早,本地媒体次之,商业平台最晚。房产平台那一行是最典型的——它一直拖到2021年才换,因为它的存量数据最多,转码代价最大。

最后两行更值得注意:那两个站没有换边的记录,它们直接从快照里消失了。这一条通向下一节。

有意思的是那几个从来没换过边的站

16个样本里有3个从2016年起就一直是标准编码,一次都没用过非标准那一套:一家国际广播机构的缅文频道、缅甸语维基百科,还有一个本地影音站。

前两个不难理解,它们的技术栈本来就是国际组织的技术栈,从一开始就没有装本地字体那个选项。

反过来说,那些用非标准编码的站,用的都是本地服务商搭的站。

这条观察对做站的人有一个直接含义:你的技术栈决定了你会被卷进哪一套事实标准。用国际通用的建站方案,这个坑天然绕开;用本地服务商的方案,得专门问一句。

那批旧页面去哪了?

这个实验的结果超出预期

前面两节说明了站点的当前状态和迁移过程,还剩最后一个问题:当年那些用非标准编码写的页面,被转码了吗?

保哥的做法是从网页存档的索引接口里,把六个站在2016到2019年间被抓取过的文章页URL拉出来,抽样,然后做两件事:取当年的原始快照判一遍编码,再拿同一个URL今天访问一次。

抽出来的样本里,当年判定为非标准编码的有21个URL。

今天再访问这21个URL,返回200的有0个

21比0是什么概念

不是被转码了,也不是被重定向到了新地址,是访问不到。

失败的形态分三种:服务器返回404、域名解析不了、连接超时。三种形态加起来把21个URL全占了。

对照组是当年就判定为标准编码的11个URL,今天仍有3个返回200。

这个对照必须说清楚它有多弱

3比11也不是什么好成绩,说明这批老URL本来就有很高的自然死亡率。

而且这个实验没法证明因果。这些站在这七年里经历过改版、换域名、换内容管理系统,缅甸这七年还经历过别的事,任何一件都足以让一批URL消失。

把21比0写成编码迁移杀死了旧内容,是在数据上跑得太远。

能写的只有一句,而这一句已经够重了:当年那批用非标准编码写的页面,今天在网上指向的是空。至于是谁弄丢的,这个实验答不了。

为什么这句话对做站的人仍然重要

因为搜索引擎的索引不看原因,只看结果。

一门语言如果它2019年之前的网页资产大面积不可访问,那么这门语言在检索这一侧的历史积累就是薄的。竞争对手的老域名、老外链、老页面,能兑现的部分比你以为的少。

这在别的语言市场上很罕见。做德语、做西班牙语,你面对的是二十年的存量;做缅甸语,你面对的存量可能只有五六年。

本站讲按母语人口排小语种优先级会排反那一篇里算过一个叫本地供给密度的变量,缅甸语这一格的答案不只是供给少,还多了一层:供给曾经有过,但那一批的字节已经不在流通体系里了。

这笔存量账怎么自己查一遍

这个实验不需要任何语言知识,一个下午能跑完,而且换成任何一门语言都能用。

第一步,从网页存档的索引接口拉取目标市场几个主要站在某个历史时间段被抓取过的地址清单,按去重和状态码筛一遍。

第二步,从清单里按固定间隔抽样,抽出看着像文章页的那些——路径层级深一点、不是图片和样式文件。

第三步,每个地址做两次访问:一次取当年的原始快照,一次直接访问今天的地址,两边都判一次。

第四步,把结果按当年状态和今天状态交叉成一张四格表,看哪一格最大。

保哥这次跑出来的形态是当年非标准编码那一列全部落进了取不到那一格。别的语言可能落进别的格子,但这张表本身能回答一个很实际的问题:你要进的这个市场,竞争对手手上那批老资产还能不能兑现

这个问题在成熟语言市场上不用问,答案默认是能。在经历过基础设施断层的语言市场上,它值得花一个下午。

用户那一侧呢,搜索框里打进去的是哪一套字节?

站点全换完了,不等于用户全换完了

前面三节测的都是网页那一侧。用户那一侧测不到设备,但能测到一个很好的代理指标:搜索建议接口。

逻辑很简单。搜索建议的候选池来自真实查询日志。如果还有大量用户用非标准编码打字,那么用非标准编码去请求建议接口,应该能拉出东西来。

保哥拿五个词的两种写法各请求了一次,参数固定为缅甸语加缅甸地区。

结果

标准编码写法非标准编码写法
手机10条0条
脸书4条0条
价格9条0条
衣服9条0条
缅甸0条2条

前四组的方向完全一致:非标准编码写法一条建议都拉不出来。

而且标准编码那一侧返回的建议词,逐条丢回模型判一遍,全部是标准编码,判定值都是0.000。

意思是候选池里没有非标准编码的查询,一条都没有。

第五组那个反例才是这一节的重点

缅甸这个词,情况反过来了:标准写法0条,非标准写法2条。

而那2条返回的建议里,第一个词是非标准编码的形态,后面跟着的词却是标准编码的形态,两套编码出现在同一条建议里。

这种混编串不可能是某个人一次打出来的,它更像是历史查询在候选池里留下的残迹。

如果不做第五组,前四组会给出一个非常干脆的结论:查询侧已经全部迁移完了。第五组把这个结论从干脆改成了基本,而基本和干脆之间那一点点差别,正好是你要不要给站内搜索加一层容错的判据。

四组零、一组反例,该怎么读

保哥的读法是这样的。

常规品类词的查询侧已经完成迁移,这一点从四组零可以支持。做词表的时候不需要为非标准编码单独准备一份,那是七年前的做法。

但索引里还留着历史痕迹,第五组证明了这一点。这意味着两件事:一是你的站内搜索日志里可能偶尔冒出看不懂的字符串,别当成攻击;二是站内搜索的输入端加一个编码归一化是划算的,成本几行代码,收益是那部分老用户不会得到零结果。

本站讲用户撞上错误页那一刻请求已经不在你的应用里了那一篇里说过,零结果页是小语种站最容易被忽略的一块。缅甸语这里多了一个特有的成因:用户打的字没错,编码不对。

顺带一个提醒:这个实验会随时间失效

这类实测的保质期很短。搜索建议的候选池会持续更新,那两条残迹明年可能就没了。

所以本篇给的不是那两条建议本身,是这个测法:用你的目标语言的两种可疑写法各请求一次,比较返回条数。二十分钟能跑完,任何语言都能用。

这对进入这个市场的人意味着什么?

三条结论,按确定性排序

第一条最确定:今天新建的缅甸语站,用标准编码就对了,不需要做双编码。四节实验没有任何一处支持双编码的必要性。这一条可以直接执行。

第二条比较确定:这门语言在检索侧的历史存量很薄。开放网页上抓得到的老内容不多,抓得到的那部分里,2019年之前的又大面积失效。

第三条是推论,请自己判断:存量薄意味着起跑线比别的语言市场平。在德语市场你要跟二十年的老域名抢位置,在缅甸语市场那个二十年不存在。

第三条的反面

起跑线平不等于容易赚。

存量薄的另一面是需求也薄。第三节测到18个站首页没有缅文,说明连本地企业都还没把这门语言当成主要的内容语言。

本站讲你能不能在这门语言上做站内搜索取决于几个志愿者那一篇里查过各语言的基础设施覆盖等级,缅甸语在那份清单里的位置并不靠前。分词、词干还原、拼写纠错这几层的工具支持,做的时候得自己兜底。

所以正确的读法是:这是一个进入成本中等、竞争强度低、天花板也低的市场。它适合作为已有东南亚布局的延伸,不适合作为第一门小语种。

什么情况下值得单独做

三种情况。

一是品类本身在这个市场有真实需求且供给稀薄,比如农机、太阳能设备、二手手机配件这类。

二是你已经做了泰语或者越南语,团队手上有东南亚的运营经验和物流方案。本站讲越南泰国印尼在语言层三家没有一处能共用那一篇提醒过,预算能共用不代表语言层能共用,缅甸语加进来是第四份完整成本,没有折扣。

三是你在做的是信息型内容而不是交易型内容。缅甸语的问答型长尾几乎没人认真写,这一块的机会比商品页大。

什么情况下不值得

如果你的判断依据是人口数,那就不值得。5500万人口这个数字在排期表上很好看,可它跟能不能变成订单之间隔着支付、物流、网络成本三道墙。

本站重排小语种优先级那一篇里的做法在这里可以直接套:把人口那一列先盖住,只看本地供给密度、工具支持和分叉复杂度三列,缅甸语这三列的分数都不高。

缅甸语还有哪几层跟编码无关但同样会咬人的问题?

第一层:没有空格

缅甸语的句子里不用空格分词,跟泰语一样,切在哪由引擎的词典说了算。

本站讲泰语的标题里找不到一个空格那一篇里那套判据在缅甸语上大部分成立,包括标题该怎么写才切得开、品牌名在正文里会被切成什么。

差别在于工具支持。泰语的分词器有好几套可选,缅甸语这一层的选择要少得多,所以能靠模板绕开分词的地方尽量绕开。

第二层:字节重,视觉字符少

缅甸语在几种常见文字里是字节最重的一门。同一句厨房用品,英语18个字节,缅甸语69个字节,是英语的3.8倍。

可它的视觉字符只有12个,比英语的18个还少三分之一。

这个组合最坑人:屏幕上看着还有很多空位,字段额度已经满了。凡是按字节限长的字段——平台的搜索词字段、数据源的标题字段、短信模板——都要单独算一遍。

第三层:字符堆叠,行高不够就糊

缅文的字符要上下堆叠,一个音节可以摞三层。默认行高在这门文字上普遍不够用,字会互相蹭。

本站讲设计稿上量出来字号一模一样那一篇里按书写系统分档的做法,缅文属于要单独提一档的那一类。

第四层:字体

缅文的字形集不小,加上堆叠规则复杂,字体文件比拉丁字体重不少。本站算过非拉丁文字的字形集有多大,缅文这一格要按复杂文字的口径算,子集化不能照搬拉丁的做法。

还有一个只在这门语言上出现的注意事项:不要在页面里指定那个非标准字体的名字。有些老模板里还留着,用户机器上万一装了那套字体,标准编码的文本会被它渲染成一堆错位的字形。

第五层:数字有两套写法

缅甸语有自己的一套数字字形,跟阿拉伯数字并存。页面上写价格、写规格、写日期,两套都能用。

这件事的处理原则跟波斯语那边一样:展示可以用本地数字,数据字段和结构化标记必须写回阿拉伯数字。

关键词那一侧要单独判一次。用户在搜索框里打数字的时候,多数手机输入法送出来的是阿拉伯数字,因为切换成本高。所以带型号、带尺寸、带年份的长尾查询,主形态大概率是阿拉伯数字那一套。

但也别把本地数字那一套全删掉。价格和数量这类给人看的位置留着本地写法,页面会显得像本地人做的,而这一层的信任成本很低。

第六层:审校和工具资源都要自己兜底

缅甸语的母语审校不好找,能同时懂SEO的更少。这不是抱怨,是排期时要算进去的一项。

本站讲母语审校说读着自然不能当验收通过那一篇里那套按层拆的验收表,在缅甸语上要往前挪一步:先验字节,再验渲染,最后才验语言。前两层不需要懂缅甸语,团队自己就能做,做完再把语言那一层交出去,审校的时间就不会浪费在描述字看着别扭上。

工具那一侧同理。分词、拼写纠错、词干还原这三样,缅甸语能拿到的现成实现都不多,能靠模板绕开的地方尽量绕开,绕不开的部分预算里单列一笔。

一套两天能跑完的缅甸语编码体检

第一天上午:判自己站上的字节

第一项,把站上所有缅甸语文本导出来,逐段过一遍检测模型。判定值超过0.95的段落挑出来,那就是漏网的旧编码。

第二项,重点查三类位置:从供应商拿来的商品描述、用户提交的评价、以及从旧系统迁移过来的历史文章。这三类是最容易混进旧编码的地方,因为它们不是你自己敲的。

第三项,查数据库里的历史记录。页面上看不见不代表库里没有,站内搜索会把它们捞出来给用户看。

第一天下午:判进来的字节

第四项,站内搜索的输入端加一道归一化。用户提交查询词的时候先判一次编码,判定值高的转成标准编码再查。

第五项,表单提交的内容同样处理,特别是评价和问答这类会进页面的内容。放一段旧编码进正文,相当于在页面里埋了一段搜索引擎读不懂的字。

第六项,看一遍站内搜索日志里的零结果查询。挑出缅文字符占多数但一条结果都没有的,逐条判编码。这一步经常能捞出真实用户。

第二天上午:字符层的常规项

第七项,按字节算一遍所有有长度限制的字段,用3.8这个倍数对着英语版估,超的标出来。

第八项,检查截断函数。缅文的堆叠字符比孟加拉文更复杂,按码位截几乎必然切坏,必须用标准的文本分段算法。这一层的账本站在孟加拉语那一篇里逐词量过,缅甸语的倍数只会更大。

第九项,全站搜一遍字体族名,把那个非标准字体的名字从样式表里清掉。

第二天下午:语言层

第十项,页面语言标签写对。缅文只有一套书写系统,地区也只有一个,所以标签本身很简单,简单到经常被漏掉。短页面尤其要补足语言证据,本站讲字最少的那几类页面最容易被机器认成另一门语言那一篇里给过一张按页面类型排的自检表。

第十一项,标题和品类名过一遍分词,确认能切开。

第十二项,找一位母语者把首页和三个主要品类页读一遍,只问一个问题:有没有哪个字看着别扭。别扭往往是渲染问题的第一信号,而渲染问题往往是编码问题的影子。

开头那家太阳能站后来改了四处

第一处最简单,把样式表里那个字体族名删掉,换成两套开源缅文字体加一个通用兜底。改完那位缅甸同事再打开,字就正常了。这一处花了十分钟,而它卡了团队四个月。

第二处是把导进来的那批历史内容全量判了一遍编码。判定值超过阈值的自动转,中间那一档人工过——中间档一共十几条,全是标题,跟前面说的规律一致。

第三处是给站内搜索的输入端加了归一化。加完之后,零结果查询里那一批看不懂的字符串就有了去处。

第四处是把检测模型接进了发布流程。这一处是团队自己加的,理由很实在:供应商还会继续发商品资料过来,而供应商用的是什么编码,谁也管不了。

四处改动里,真正解决问题的是第一处,真正防止复发的是第四处,中间那两处是打扫战场。保哥觉得这个比例挺有代表性——编码这类问题,找到它花的时间远多于修它,而修完之后不装那道闸,半年后又会长回来。

三种看着稳妥、实际会留后患的做法

第一种:为了保险,两套编码都发一份

2019年前后这是标准建议,今天不是了。

四节实验里没有一处支持它。站点侧16比0,查询侧四组零,双编码要付的是双份内容成本加一份重复内容风险,换来的是候选池里那两条残迹。

如果确实担心那部分老用户,正确的位置是站内搜索的输入端做归一化,而不是页面上多发一份。前者几行代码,后者是一整套内容。

第二种:找一个在线转换工具,把老内容批量转一遍

可以做,但要先接受一件事:转换不可能百分之百准。

Unicode官方那份常见问题里给了原因——有些字符串在两套编码下都是合法的,所以判定本身就没法做到完全准确。判定不准,转换自然也不准。

可行的做法是分档:判定值超过0.95的自动转,低于0.05的不动,中间那一档人工过。中间那一档通常很小,但里面往往是短文本,而短文本经常是标题。

这跟本站讲机器复制走的是另一串字符那一篇里的处理原则是一致的:自动化处理量,人工处理边界。

第三种:把这件事当成一次性任务做完就归档

这是最容易犯的一个。

编码这一层不是做完就结束的,它有持续的入口:供应商的商品资料、用户提交的内容、外包团队交付的稿子、从旧库里补录的历史文章。

只要还有人从外面往站里放缅甸语文本,就得有一道回归检查。把检测模型接进内容发布流程,判定值超阈值就拦下来,这道闸一次配好,之后不用管。

还有一个提醒:别把这套结论搬到别的语言上

缅甸语这一件的特殊之处在于它已经迁移完了。同样是编码遗留,别的语言可能停在不同的阶段。

本站写过的罗马尼亚语那两个字母的两套码位就是另一种形态——两套码位都是Unicode标准里的合法码位,一套是历史遗留一套是正确写法,至今并存,而且不会有哪一天彻底结束。

要搬的是测法:找到这门语言可能存在的两种字节形态,各请求一次搜索建议,再抓一批站判一遍,最后倒回历史快照画一条曲线。三步下来,这门语言在编码这一层处在哪个阶段就清楚了。

常见问题解答

现在做缅甸语站,还需要考虑旧编码吗?

页面输出不需要,用标准编码就对了。实测16个能判定的缅甸语站全部是标准编码,搜索建议的候选池里也拉不出旧编码的查询。需要考虑的只有两个入口:一是从外部拿进来的文本,供应商资料、用户评价、历史迁移数据,这三类可能混进旧编码;二是站内搜索的输入端,加一道归一化能接住那部分还没换设备的用户。

两套编码肉眼真的看不出来吗?

有些看得出,有些看不出。差异分三类:只差一个码位的那一类,两个符号形状极接近,不懂缅文的人完全看不出;码位数不同还借用了掸语码位的那一类,仔细看能发现字形不对;存储顺序相反的那一类,如果字体不匹配,屏幕上会明显错位。所以肉眼检查只能抓住最严重的那一档,剩下的必须靠程序判。

为什么说这不是普通的乱码?

因为乱码的特征是页面报错或者显示成方块,编码声明和实际字节对不上。缅甸语这一件里,字符集声明是对的,字节是合法的UTF-8,浏览器不给任何提示,屏幕上显示的也是缅文。两套方案占用同一个码位区间,只是分配方式不同。工具层面查不出来,只能靠统计模型判。

那条从三分之二掉到零的曲线,能证明是官方迁移日起的作用吗?

不能,只能说形状吻合。掉得最狠的一段是2018年年中到2019年年底,官方定的日期落在这一段里。但样本只有九到十个站,一个站换边就是十个百分点,而且迁移在定日期之前就已经在推进。能确定的是这条曲线的形状不像自然演化,自然演化不会在一年半里掉掉一半。

2019年之前那批缅甸语老页面今天真的全没了吗?

抽样到的那21个URL今天确实一个都打不开,但这个结论有边界。第一,样本只有21个,来自六个站;第二,对照组里当年就是标准编码的11个URL今天也只剩3个能开,说明老URL本来就有很高的自然死亡率;第三,改版、换域名、换系统都能造成同样的结果,这个实验分不出原因。能说的只有一句:这批URL今天指向的是空。

缅甸语值不值得做,判断依据是什么?

把人口那一列先盖住。真正要看的是三列:本地供给密度、工具支持程度、内容能不能复用现有的东南亚资产。缅甸语前两列的分数都不高,第三列取决于你有没有泰语或越南语的底子。适合作为已有东南亚布局的延伸,不适合作为第一门小语种。如果品类本身在这个市场供给稀薄,或者你做的是信息型内容而不是交易型内容,值得的概率会高不少。

怎么判断另一门语言有没有同样的编码分叉?

三步。第一步查这门语言有没有过广泛使用的非标准字体编码,Unicode官方的语言常见问题页通常会写。第二步用这门语言的两种可疑写法各请求一次搜索建议接口,看返回条数差多少。第三步抓二十个这门语言的站判一遍编码,再从网页存档里取几个历史时间点画一条曲线。三步跑完大概两小时,就能知道这门语言在编码这一层处在哪个阶段。

权威参考资料

分享到
标签
版权声明

本文标题:《缅甸语网页在七年里换掉了一整套字节,当年那批旧页面今天一条都打不开》

本文链接:https://zhangwenbao.com/burmese-seo-zawgyi-unicode-byte-split.html

版权声明:本文原创,转载与引用请注明作者与原文链接。许可协议: CC BY 4.0

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交