您尚未登录。

#1 2019-09-30 09:09:09

驿窗
驿窗
注册时间: 2016-06-03
帖子: 804

能否确保PDF文件在任何环境里都不会乱码?

我之前认为,只要确保PDF文件嵌入字体,应该就可以解决乱码的问题,最近我发现好像不是这样;

举个例子,如果PDF文件在制作时,系统环境使用的是UTF-8,但有人在打开这个PDF文件时使用的环境不是UTF-8,那么是不是就可能会出现乱码?
(我理解UTF-8是代表传输,在编码本质上是unicode,但unicode与GB2312或者GBK好像并不兼容)

或者,给所有PDF文件阅读者加个限制条件:必须使用unicode编码来打开PDF文件,这样行得通?

我好像还没搞懂乱码这件事。

ps:
有一种方式,是把PDF保存成图片版本,而非文字版本,但这种方法对大量文件会有问题,制作成本和储存成本都比较高,所以有时不太适用。

最近编辑记录 驿窗 (2019-09-30 09:18:51)


-----------------------------------
开源/Linux大众化,从驿窗开始~

离线

#2 2019-09-30 11:11:07

farseerfc
会员
注册时间: 2013-07-30
帖子: 208
个人网站

Re: 能否确保PDF文件在任何环境里都不会乱码?

相關細節都在 PDF 標準裏面應該有說明 https://www.adobe.com/content/dam/acom/ … 0_2008.pdf
具體看上述標準 9.6.6 Character Encoding 和附錄D。

根據我的理解,PDF 沒有規定用什麼字符集,但是 PDF 文件中使用的每個字體都有對應的字符集編碼。
根據字體的格式,可以有 Type 1 字體、 Type 3 字體、 TrueType 字體,他們的字符集編碼有分別不同的描述方式。

對 Type1 字體,嵌入字體的時候可以指定一個預設命名字符集(predefined / named encoding),同時可以在預設命名字符集的基礎上指定一個字符變更表。
對 Type3 字體,要求指定一個預設命名字符集。
對 TrueType 字體,字體文件有 cmap 描述字符集映射,也可以指定預設命名字符集。
然後預設字符集有 Adobe 標準字符集: StandardEncoding, MacRomanEncoding, WinAnsiEncoding,  and  PDFDocEncoding ,
還有 Adobe 對額外語言(主要是東亞語言)定義的額外預設字符集。poppler 庫針對後面這些擴充的預設字符集在 poppler-data 包有提供 unicodeMap 和 cMap 映射表。

順便 Type1 的字符集不同於別的軟件的字符集定義的一點在於, Type1 是把字符映射到字形名(glyph name)而非字符編碼(character code),
因此 PDF 可以包含那些有同一個字符編碼但是稍微不同字形的字(比如中日韓漢字的字形區分)。也因爲這個 PDF 的字符集轉換不像普通程序那樣處理,
也因此可能遇到能顯示打印字形卻不能選擇複製的問題。

而 TrueType 字體用的 cmap 字符映射表描述的不是字形名,是一個或多個對應平臺的字符集,PDF 閱讀軟件可以選合適的。

總之 PDF 的字符編碼格式有些複雜,不像文本文件那樣挑選一個正確的字符編碼就可以做對應。這套東西用對了的話,理論上應該是可以保證在任何環境都不會亂碼的,但是如果有哪兒出錯了,出現亂碼的情況下也有很多可能出錯的地方,要拿 PDF 文件具體分析。


computerは神様だと信じていて
だからVIMの上でずっと指が舞って
自ら恋愛相手を作り出して

离线

#3 2019-09-30 11:11:23

zplinux
会员
所在地: 江西省
注册时间: 2014-10-12
帖子: 183

Re: 能否确保PDF文件在任何环境里都不会乱码?

pdf 格式应该是不受本地编码方式的影响, 几乎以一致的效果显示文档内容。

没有去深究这个问题,但我觉得无外乎两种方式:
1. pdf 文档格式内置了字体和编码信息
2. pdf 文档保存的是基于原始显示效果的矢量对象

楼主能描述一个实例, 这样讨论可能会更有针对一些。


曾经用过 CentOS,怀念 Gnome2 的桌面!现在投奔 ArchLinux 阵营,深深地被它 K.I.S.S 理念所吸引了……

离线

#4 2019-09-30 13:16:40

驿窗
驿窗
注册时间: 2016-06-03
帖子: 804

Re: 能否确保PDF文件在任何环境里都不会乱码?

信息量比我想象的大,我先消化一下,要不然接下来我可能都不知道应该问什么以及从哪开始问~


-----------------------------------
开源/Linux大众化,从驿窗开始~

离线

#5 2019-09-30 14:52:36

依云
性别女,请正确称呼
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 5,769
个人网站

Re: 能否确保PDF文件在任何环境里都不会乱码?

我只见过制作不良的 PDF(未嵌入应当嵌入的字体)乱码的。

离线

#6 2019-09-30 16:26:55

zplinux
会员
所在地: 江西省
注册时间: 2014-10-12
帖子: 183

Re: 能否确保PDF文件在任何环境里都不会乱码?

依云 说:

我只见过制作不良的 PDF(未嵌入应当嵌入的字体)乱码的。

依稀记得我以前查笔记本的硬件信息, 从日文网站下载的 pdf 似乎呈现出大量文字信息不显示的情况,
可能是没嵌入字体信息, 而本机又缺少相应适配字体导致的乱码。


曾经用过 CentOS,怀念 Gnome2 的桌面!现在投奔 ArchLinux 阵营,深深地被它 K.I.S.S 理念所吸引了……

离线

#7 2019-09-30 18:48:49

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,139

Re: 能否确保PDF文件在任何环境里都不会乱码?

PDF是挺复杂的,它不一定使用Unicode编码文本,只要能正确找到字体(内嵌或外部搜索),将字节串正确映射到字形序列就行了。它设计上就不是一种文本格式,就是给你能看见文档就可以,所以Unicode啥的不是一件重要的事情,甚至需要被避开。阅读器的选择功能其实都实现的很差,只能应付极其有限的情况 。PDF 甚至没有段落的概念,文本其实不能跨行的。你看见的Adobe Reader 的段落选择功能其实是究极黑魔法。

最近编辑记录 xtricman (2019-09-30 18:49:19)


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#8 2019-09-30 20:41:19

依云
性别女,请正确称呼
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 5,769
个人网站

Re: 能否确保PDF文件在任何环境里都不会乱码?

现代 PDF 有字符对应的 Unicode 码点映射表了,以用于数字化阅读器的文本处理。
从 PS 发展而来的 PDF 本质就是在页面上写写画画的指令而已。有些例如表单、脚本、附件等高级功能,但很少见到有人使用,大部分阅读器也不支持。

离线

页脚