英文居然有“合字”这种冷知识,用 typora 输出 pdf 时碰到坑了

2019-04-26 17:12:08 +08:00
 tankb52

给新人写说明文档,当中有 wifi 一词,输出 pdf 后,新人直接复制文档中的内容,执行的时候出问题了。
我查看日志发现是 wifi 处出现了乱码,好生奇怪。
去网上一搜,才知道英文中有“合字”这一概念, 见 WIKI: 合字 ,常见的 æ& 就是合字。 我碰到的坑,就是wifi 中的 fi,输出文档时,被当成了合字,虽然显示是正常的,但复制后搜索,两个字母合在一起,变成了另外一个字符
我不确认这是 Typora 的 bug 还是 Win10 的 bug,看了维基也不是很理解合字的用途。但 wifi是一个很常见的单字,不知道大家在写文档的时候,有碰到过类似的问题吗?又是如何解决的呢?

20511 次点击
所在节点    Markdown
46 条回复
deepdark
2019-04-26 17:18:12 +08:00
一般不都是 WI-FI 吗
mytry
2019-04-26 17:18:57 +08:00
还有更神奇的呢,'fi'.toUpperCase() == 'FI','ffi'.toUpperCase() == 'FFI'
UIXX
2019-04-26 17:19:20 +08:00
标准表达 Wi-Fi
mytry
2019-04-26 17:19:42 +08:00
汉子也还有啊,嬲(逃)
cway
2019-04-26 17:19:44 +08:00
用 Typora 测试了下,生成后的 pdf 没这
geelaw
2019-04-26 17:21:30 +08:00
这并不是一个 bug。这是是 Unicode 把 codepoint 和渲染方式耦合的结果,一个正确的文本搜索算法应该进行 Unicode 规范化比较,在某些模式下 fi 合字和 fi 应当是相等的。

很多排版系统为了确保某些字最终显示、印刷是以合字的形式出现,会选择用合字字符替换原来的字符序列。

另外,合字并不是只有拉丁文本才有,汉语的 biáng biáng 面的那个字也是合字,招财进宝也可以合为一个字,此外阿拉伯语有非常非常多的合字。

我个人喜欢把合字叫做连笔,这是一种书法风格。
tinkerer
2019-04-26 17:22:58 +08:00
@geelaw 所以... 是因为 PDF 为了打印效果转成合字了么
xiaolanger
2019-04-26 17:23:04 +08:00
@Livid 我说句题外话,右侧的 Mou 链接 是不是可以下了?
marsgt
2019-04-26 17:23:24 +08:00
替换成“ WiFi ”更正规吧,或者你找找字体设置里有没有 OpenType 的连字选项,或者干脆换个非 OTF 的字体好了。。
这个用途主要是在老式的排版里,会把常见的一些组合(比如 fi、ff )打成一个铅字,这样 2 合 1 了之后会比较省纸。。
geelaw
2019-04-26 17:26:17 +08:00
@tinkerer #7 是的,这个和字体也有关系,例如有些字体只有在显示合字字符时才用合字风格,另外一些字体则可以把多个字符连排时就显示合字(可以注意很多手写字体在小写字母旁边有其他字母时会进行连接,就是用了对合字排版的支持),也和排版软件(的选项)有关系。
tinkerer
2019-04-26 17:29:48 +08:00
@geelaw 学习了
marsgt
2019-04-26 17:34:39 +08:00
其实技术这块你可以直接找个等宽字体试试,一般代码字体撑死了就 FireCode 这种只合“=>”、“===”符号的。有中文的话可以用更纱黑( https://github.com/be5invis/Sarasa-Gothic/releases )这种同时压进了英文和中文的。
tankb52
2019-04-26 17:37:54 +08:00
@marsgt
Typora 编辑和导出 PDF 时,好像都没有字体设置啊?
marsgt
2019-04-26 17:39:30 +08:00
@tankb52
我查了下文档,好像字体得手写 CSS🤦‍♂
或者你试试换个主题?主题里好像会改字体
tankb52
2019-04-26 17:47:21 +08:00
@geelaw
那我这种情况有什么办法规避呢?
Universe
2019-04-26 17:48:58 +08:00
想到写 python2 的时候处理字符串,用 strip(char)的时候,有可能会因为 utf8 格式汉字的后半正好是 char 而被吞掉半个字造成不能 decode 回 unicode 的情况。。。
awesomes
2019-04-26 17:52:19 +08:00
@mytry 有啥神奇的 'fi'.toUpperCase() == 'FI' 和 ’'ffi'.toUpperCase() == 'FFI' 都为 true
arfaWong
2019-04-26 17:52:24 +08:00
PDF 阅读器的锅,曾经遇到类似的情况
tinkerer
2019-04-26 17:58:12 +08:00
@awesomes fi 是一个字符, 并不是 f 和 i
mytry
2019-04-26 18:00:14 +08:00
@awesomes 'ffi'.length ===1 'FFI'.length === 3

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/559009

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX