泰文:小票和厨房单为什么会排错
泰文有两个特点,会把按英文思路写的程序直接打垮:
- 词和词之间不空格 —— 一句话是连着写下来的。 按空格换行,结果就是从词中间断开,泰国人读起来是另一个词。
- 符号是往上叠的 —— 一个辅音上面可以叠元音符号,元音符号上面再叠声调符号, 最多三四层。行距不够就把上面的切掉了。
还有第三个不影响打印、但每天影响店员的:泰文有五个元音是写在辅音前面、 读在辅音后面的,所以商品列表按字母排序,排出来的顺序泰国人看着是乱的。
本文核对状态
文字规则是标准里写死的,稳定。打印机相关的要实测。
待核实 ——
TODO: verify
- 打印机支不支持泰文字符集,编号多少。
- 字库能不能完整渲染三层叠加的符号,会不会被切。
- 厨房打印机(通常是另一款更便宜的)表现是否和前台一样。
- 小票上要不要用佛历(见泰国那篇)。
一、不空格 —— 换行必须用专门算法
泰文里的空格是分句子的,大概相当于中文的逗号句号,不是分词的。
所以按空格换行是错的,会从词中间断开。正确的做法要用带泰文词典的 断词算法。
这是选系统时第一个要问的:泰文商品名换行你们怎么处理? 用的是什么算法?没有泰文词典的系统,怎么配都断不对。
好消息:泰文没有大小写、没有句号,所以不会有大小写转换那类问题。
二、符号往上叠 —— 两个后果
一个泰文字可以是这样叠起来的:
- 底下:辅音(只有这个占位置)
- 上面或下面:元音符号
- 再上面:声调符号
- 偶尔顶上还有一个
所以一个字可能有四层高,但只占一格宽。
后果一:按字符个数算对齐是错的。 叠上去的符号不占横向宽度,按字符数补空格会补多,列就歪了。 用干净的英文测试数据看不出来,用真实泰文商品名就歪。
后果二:行距太紧会把上面的声调符号切掉。 这个最阴险 —— 切掉之后不懂泰文的人看着"字都在", 泰国人看就是另一个词或者读不通。和阿拉伯语字母不连笔是同一类陷阱。
三、排序:不影响打印,但每天影响店员
泰文有五个元音(เ แ โ ใ ไ)是写在辅音左边、但读在辅音后面的。
所以泰文词典里,这些词是排在辅音下面的,不是排在这个元音下面。
如果商品列表按字符编码排序,排出来的顺序泰国人看着是乱的, 店员找商品会一直找不到,每天浪费时间。
这一条在小票上完全看不出来,但店员每个班都在受影响。 选系统时问一句:商品列表和搜索用的是泰文排序规则吗?
四、编码和图形打印
大多数打印机不认 UTF-8,泰文要专门的字符集(TIS-620 或 CP874), 具体支持情况和编号要实测。
建议直接用图形打印(软件把小票渲染成图片再打)—— 叠加符号、字库覆盖、编码问题一次全解决。
但有一点要注意:图形打印不解决换行问题。 换行是在渲染之前做的,所以就算用图形打印,上游还是得有泰文断词算法。 这是泰文和其他语言不一样的地方——别的语言图形打印基本能包治,泰文不能。
五、数字和日期
泰文有自己的数字(๐๑๒๓๔๕๖๗๘๙),但商业单据上一般用我们熟悉的阿拉伯数字。
要能切换,别写死,同一张单上不要两种混用。
佛历比公历早 543 年,2026 年是佛历 2569 年,泰国商业单据常用。 不管用不用,系统里存日期一定要存一种标准格式,显示时再换算 —— 直接存佛历,迟早出现差 543 年的 bug。
六、验收清单
用实际要买的打印机打,并且找泰国人看。
| 序号 | 打什么 | 合格标准 |
|---|---|---|
| 1 | 一个三层叠加的字(如 ที่) |
符号都在,上面没被切掉 |
| 2 | 长到要换行的商品名 | 断在词和词之间,不是词中间 |
| 3 | ำ 出现在行尾 |
没被拆开 |
| 4 | 三行长短不一的商品 | 金额小数点上下对齐 |
| 5 | ฿ 货币符号 |
是符号,不是方框 |
| 6 | 商品列表按字母排序 | เ แ โ ใ ไ 开头的词排在辅音下面 |
| 7 | 同一张单用厨房打印机再打一遍 | 结果和前台一样 |
| 8 | 重打一张旧单 | 和原来一模一样 |
第 1、2、6 条不懂泰文的人看不出问题,必须找泰国人。 第 7 条单独列出来是因为厨房打印机通常是另一款更便宜的机器, 前台能打对不代表厨房能。
七、挑系统时该问清楚的问题
- 泰文换行用的是什么算法?有泰文词典吗?会不会从词中间断?
- 泰文小票是靠打印机字库还是图形打印?
- 行距够不够?声调符号会不会被切掉? 打一张给我看。
- 金额列对齐是按字符数算还是按显示宽度算?
- 商品列表和搜索用的是泰文排序吗?
- 佛历能不能显示?系统里是怎么存日期的?
฿能不能打印?- 厨房打印机单独测过吗? 用我要买的那台打一张。
第 1 条和第 5 条是最容易被忽略、又最影响日常使用的。
由秘奥软件(MISAll)团队维护。最后更新:2026-08