泰文:小票和厨房单为什么会排错

泰文有两个特点,会把按英文思路写的程序直接打垮:

  1. 词和词之间不空格 —— 一句话是连着写下来的。 按空格换行,结果就是从词中间断开,泰国人读起来是另一个词。
  2. 符号是往上叠的 —— 一个辅音上面可以叠元音符号,元音符号上面再叠声调符号, 最多三四层。行距不够就把上面的切掉了。

还有第三个不影响打印、但每天影响店员的:泰文有五个元音是写在辅音前面、 读在辅音后面的,所以商品列表按字母排序,排出来的顺序泰国人看着是乱的。

本文核对状态

文字规则是标准里写死的,稳定。打印机相关的要实测。

待核实 —— TODO: verify

  1. 打印机支不支持泰文字符集,编号多少。
  2. 字库能不能完整渲染三层叠加的符号,会不会被切。
  3. 厨房打印机(通常是另一款更便宜的)表现是否和前台一样。
  4. 小票上要不要用佛历(见泰国那篇)。

一、不空格 —— 换行必须用专门算法

泰文里的空格是分句子的,大概相当于中文的逗号句号,不是分词的

所以按空格换行是错的,会从词中间断开。正确的做法要用带泰文词典的 断词算法。

这是选系统时第一个要问的:泰文商品名换行你们怎么处理? 用的是什么算法?没有泰文词典的系统,怎么配都断不对。

好消息:泰文没有大小写、没有句号,所以不会有大小写转换那类问题。

二、符号往上叠 —— 两个后果

一个泰文字可以是这样叠起来的:

所以一个字可能有四层高,但只占一格宽

后果一:按字符个数算对齐是错的。 叠上去的符号不占横向宽度,按字符数补空格会补多,列就歪了。 用干净的英文测试数据看不出来,用真实泰文商品名就歪。

后果二:行距太紧会把上面的声调符号切掉。 这个最阴险 —— 切掉之后不懂泰文的人看着"字都在", 泰国人看就是另一个词或者读不通。和阿拉伯语字母不连笔是同一类陷阱。

三、排序:不影响打印,但每天影响店员

泰文有五个元音(เ แ โ ใ ไ)是写在辅音左边、但读在辅音后面的。

所以泰文词典里,这些词是排在辅音下面的,不是排在这个元音下面。

如果商品列表按字符编码排序,排出来的顺序泰国人看着是乱的, 店员找商品会一直找不到,每天浪费时间。

这一条在小票上完全看不出来,但店员每个班都在受影响。 选系统时问一句:商品列表和搜索用的是泰文排序规则吗?

四、编码和图形打印

大多数打印机不认 UTF-8,泰文要专门的字符集(TIS-620 或 CP874), 具体支持情况和编号要实测。

建议直接用图形打印(软件把小票渲染成图片再打)—— 叠加符号、字库覆盖、编码问题一次全解决。

但有一点要注意:图形打印不解决换行问题。 换行是在渲染之前做的,所以就算用图形打印,上游还是得有泰文断词算法。 这是泰文和其他语言不一样的地方——别的语言图形打印基本能包治,泰文不能。

五、数字和日期

泰文有自己的数字(๐๑๒๓๔๕๖๗๘๙),但商业单据上一般用我们熟悉的阿拉伯数字。 要能切换,别写死,同一张单上不要两种混用

佛历比公历早 543 年,2026 年是佛历 2569 年,泰国商业单据常用。 不管用不用,系统里存日期一定要存一种标准格式,显示时再换算 —— 直接存佛历,迟早出现差 543 年的 bug。

六、验收清单

用实际要买的打印机打,并且找泰国人看

序号 打什么 合格标准
1 一个三层叠加的字(如 ที่ 符号都在,上面没被切掉
2 长到要换行的商品名 断在词和词之间,不是词中间
3 出现在行尾 没被拆开
4 三行长短不一的商品 金额小数点上下对齐
5 ฿ 货币符号 是符号,不是方框
6 商品列表按字母排序 เ แ โ ใ ไ 开头的词排在辅音下面
7 同一张单用厨房打印机再打一遍 结果和前台一样
8 重打一张旧单 和原来一模一样

第 1、2、6 条不懂泰文的人看不出问题,必须找泰国人。 第 7 条单独列出来是因为厨房打印机通常是另一款更便宜的机器, 前台能打对不代表厨房能。

七、挑系统时该问清楚的问题

  1. 泰文换行用的是什么算法?有泰文词典吗?会不会从词中间断?
  2. 泰文小票是靠打印机字库还是图形打印?
  3. 行距够不够?声调符号会不会被切掉? 打一张给我看。
  4. 金额列对齐是按字符数算还是按显示宽度算?
  5. 商品列表和搜索用的是泰文排序吗?
  6. 佛历能不能显示?系统里是怎么存日期的?
  7. ฿ 能不能打印?
  8. 厨房打印机单独测过吗? 用我要买的那台打一张。

第 1 条和第 5 条是最容易被忽略、又最影响日常使用的。


由秘奥软件(MISAll)团队维护。最后更新:2026-08