占位文本和摩尔斯电码:两个生成器各自藏了什么规则
站内有两个页面是「生产文字」而不是「度量文字」的:假字生成器 和 摩尔斯电码。两者都只在页面里算,不发任何请求,也都在界面之外写了几条不会告诉你的规则。
假字:数量框的行为和它标的上下限不一样
三个控件——语种(拉丁文 / 中文)、单位(段 / 句 / 词)、以及一个标着 min=1 max=50 的数量框。数量先被脚本自己解释一遍,再套用上下限,于是结果和界面给人的预期有偏差:
- 空着,或者填了非数字 → 3。
- 填 0 → 也是 3,而不是 1。脚本在「小于 1 就抬到 1」这条检查之前,先把读到的 0 换成了默认值。
- 填 1 → 1,能进到检查这一步的数字都会被下限接住。
- 填 500 → 50,上限这条是正常的。
另外这个框是 change 提交而不是逐键提交,所以敲完数字不点别处、也不按回车,就不会重新生成——你看到的仍是上一个值的结果。
拉丁文来自那一段西塞罗,词元带着原文的标点
那段经典文本按空格和逗号被切成 69 个词元,其中 64 个互不相同(dolor、ut、dolore、in 会重复出现)。切分时逗号被吃掉了,句号却留在它前面那个词上,于是有 5 个词元自带句号:elit. aliqua. consequat. pariatur. laborum.
表现出来就是两件事:
- 句号翻倍或句中出现断点。 一个自带句号的词元落在句子中间,就会被读成一句说完;落在末尾则出现
..。 - 随机大写。 有 5 个词元保留了它们在原文句首的大写——
LoremSedUtDuisExcepteur——所以句子中间随时会冒出一个大写词,看着像专有名词。
反过来,逗号一个都不会留下。生成出来的拉丁文里没有逗号,这正是它读起来一路平铺、不断句的原因。
长度不是随机的,而是固定套路:段 = 先取 3–7 个词元、首字母大写并补一个句号,再追加 2–4 个词元和一个句号,也就是 5–11 个词一段;句 = 5–14 个词,且所有句子连成一行输出,不是一句一行;词 = 直接吐 N 个词元。
中文假字是真中文,但内容写的是本站
中文模式有独立的数据,不会像某些站那样把中文换成英文。三点要在放进设计稿之前知道:
- 段模式 是从固定的 12 句里取 3–8 句直接相接,每句本身以
。结尾,所以不需要分隔符。 - 句模式 同样从这 12 句里取 N 句,用空格隔开。数量一大,重复是常态而不是巧合——池子就这么小。
- 词模式 从 53 个词里取(
猫 工具 站 免费 在线 实用 浏览器 …),词与词之间留空格。这读起来是关键词墙而不是文章,用来检验中文字形的折行没问题,用来判断真实文案的观感不合适。
而这 12 句写的是本站与同系列品牌,所以中文假字铺满版面后,页面上会实实在在出现「猫工具站是猫系列品牌的一员」这类句子。稿子要给外人看的话,这一层值得替换掉。
电码:可用码表比对照图大得多
页面上的对照网格画了 36 格——A 到 Z、0 到 9。但翻译用的表里有 57 条:这 36 条之外还有 21 个标点(. , ? ! : ; ' " ( ) [ ] { } & * @ = + - /)。
也就是说,标点是能正确编码的,尽管页面上有三处文案说不能。Hello, world! 会输出标准的逗号码和叹号码。真正没有对应编码的是 ASCII 字母、数字和这 21 个标点之外的字符——带重音的字母(café 里的 é)、货币符号、中日韩文字、emoji,它们一律变成 ?。
字母查表前先转大写,所以输入的大小写不影响结果。
空格、斜杠,以及不对称的往返
- 字母之间一个空格,单词之间用
/。 - 切分依据是任意空白,因此换行等同于一个词分隔符——粘贴多行文本,原来的换行处会变成
/。 - 输入不做 trim。行首或行尾多出来的空格会成为一个「空词」,在结果开头或结尾留下一个多余的
/。
解码方向刻意做得宽容:认不出的码不报错,直接以 ? 就地替换。但反向映射是多对一的,因为有三组标点共用一个码——(、[、{ 都是 -.--.,)、]、} 都是 -.--.-。这组字符编码后再解码,回来的一定是 { 和 },与进去时是什么无关。除此之外都能原样往返,前提是你解码的是工具输出的大写结果。
发音:节拍数值,以及它为什么会叠在一起
振荡器固定 700 Hz,通断没有淡入淡出,所以音量小的时候听起来像 clicks。代码里的时长是:
| 间隔 | 秒 | 折算成「点」 |
|---|---|---|
| 点 | 0.08 | 1 |
| 划 | 0.24 | 3 |
| 字符内部间隔 | 0.08 | 1 |
| 字符之间间隔 | 0.20 | 2.5 |
| 单词之间间隔 | 0.40 | 5 |
点和划的比例是教科书式的(一划等于三点),但字符间和词间的间隔被压短了,分别是 2.5 点和 5 点,而页面自己的说明写的是通行的 3 和 7。所以真实听感比标准电码更急、更挤——如果你用它来练听音节拍,这一点要计入;如果只是听听一个词怎么拼,无所谓。
播放还有三个机制上的事实:
- 凡不是
.的字符都按划发音,包括不支持字符变出来的?。文本里混进一个重音字母,音频里就多出一划。 - 每次点播放都会新建一个音频上下文,而页面没有停止按钮。连点两次就是两遍叠在一起,只能等前一遍播完;这些上下文也会一直累积到刷新页面。
- 编码模式下,播放读的是结果框,而结果框可以手改。你可以在那里手动调点和划,播出翻译器永远不会生成的序列。
你的文字会去哪儿
两个页面都不外发任何内容:生成和翻译都发生在页面脚本里,唯一离开机器的流量是这个站本来就会有的统计、广告,以及桌面端的 Live2D 组件。两页都保留了实时示例——电码页打开时输入框里是 SOS,假字页打开时已经生成过一次——所以你没有输入之前看到的那些,是示例而不是你的结果。