【问题标题】:search or convert octal sequences搜索或转换八进制序列
【发布时间】:2012-11-25 20:44:04
【问题描述】:

我已经使用 pdftk 解压缩了一个 PDF 文件,并且我正在尝试使用 regexp 在 Emacs 中对其进行编辑。

问题是这个文件有重音字符,Emacs 将它们显示为八进制序列:例如\340 为à。要编辑这个文件,我有两种可能性(至少我是这么认为的)。

a) 应用一种编码,这样 Emacs 将显示实际的重音字符,而不是它们的等效八进制字符。 Vim 已经正确显示重音字符;

b) 使用正则表达式搜索八进制序列。

至于a),我试过(set-buffer-file-coding-system 'utf-8-dos),(set-buffer-file-coding-system 'utf-8-unix),(set- buffer-file-coding-system 'raw-text) 没有成功。

至于 b),在应用 set-buffer-file-coding-system 后,我可以使用 C-q ... RET 增量搜索八进制序列,但我无法做我真正需要的事情:替换字符串。事实上C-q ... RET,在使用M-% 或C-M-% 时不匹配八进制序列。 C-x 8 `... 也不起作用。

提前致谢。 安东尼奥

【问题讨论】:

  • 你能在某处上传一个示例 PDF 吗?
  • 新手,希望可以发链接。无论如何,我刚刚创建了一个单行测试文件:filedropper.com/test_16。在 Emacs 中查看第 47 行并注意如何手动将 \340 替换为 à,保存并在 PDF 查看器中重新打开它。
  • 单个高位八进制字符肯定不是 UTF-8。尝试使用 CP1252 或 CP850。

标签: emacs elisp


【解决方案1】:

在访问 PDF 文件的缓冲区中尝试以下键序列:

C-x RET r 字符编码 RET

这将使用您指定的字符编码重新访问文件。

或者,如果你想在访问文件之前指定要使用的字符编码,你可以这样做

C-x RET c 字符编码 RET

在输入 C-x C-f 之前。

有关详细信息,请参阅documentation。

【讨论】:

  • 问题解决了!感谢记录,编码是 windows-1252-unix 别名 cp1252-unix 或通常带有 Unix 行尾的 ANSI。奇怪的是(set-buffer-file-coding-system 'windows-1252-unix) 不起作用,(revert-buffer-with-coding-system 'windows-1252-unix) 起作用。好处是,使用这种编码,可以修改(使用正则表达式)“未压缩”的 PDF,保存并在查看器中重新打开,这可能对其他人感兴趣。搜索替换八进制代码的主题可能仍然令人感兴趣。
  • @antonjo:你为什么说“奇怪”? C-h f set-buffer-file-coding-system 说的很清楚:“这意味着当你保存缓冲区时,它会根据 CODING-SYSTEM 进行转换。”
  • @Stefan 我猜这很“奇怪”,因为这个命令被一些用户感知做一些事情而不是它实际做的事情。 antonjo 正在寻找的是:“我在缓冲区中有数据,一些字符显示不正确。我想要一个命令,根据不同的字符编码重新解释这些字符。”这不是set-buffer-file-coding-system 所做的,但如果它是用户期望 的,它的行为会被认为是奇怪的。这是一个可用性问题,是用户对编码/缓冲区/文件的心理模型与 Emacs 实际处理这些事情的方式之间的不匹配。
  • @Thomas:好点子。我想知道我们如何才能减少混乱。如果有人有想法,请发送至M-x report-emacs-bug。
【解决方案2】:

@斯特凡

其实我说的不是保存的区别,而是显示的区别。

在这两种情况下,关闭和重新打开文件都会使文件保持原样,没有明显的变化。 至于显示,(set-buffer-file-coding-system 'windows-1252-unix) 模式行从(Unix) --- 变为(Unix) **-,表示代码系统没有发生变化,实际上缓冲区中的字符是相同的(八进制序列仍然存在)。

当使用 (revert-buffer-with-coding-system 'windows-1252-unix) 时,模式行从(Unix) --- 更改为* (Unix) ---,表示代码系统已更改为windows-12**,根据@987654327 @助记符,实际上八进制序列以其等效的重音字符显示。

如果我将(set-buffer-file-coding-system 'windows-1252-unix) 应用于其他缓冲区,例如暂存区,则后者会从1\-- 更改为* (Unix) **。所以对于这个缓冲区有从latin-1-dos到windows-1252-unix的实际和广告变化。

这很可能有一个连贯的设计,我不知道。

安东尼奥

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 2016-03-27
    • 2012-10-20
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多