1

Emacs 24.3.1、Windows 2003

我发现“字节到位置”功能有点奇怪。

根据文件:

 -- Function: byte-to-position byte-position
     Return the buffer position, in character units, corresponding to
     given BYTE-POSITION in the current buffer.  If BYTE-POSITION is
     out of range, the value is `nil'.  **In a multibyte buffer, an
     arbitrary value of BYTE-POSITION can be not at character boundary,
     but inside a multibyte sequence representing a single character;
     in this case, this function returns the buffer position of the
     character whose multibyte sequence includes BYTE-POSITION.**  In
     other words, the value does not change for all byte positions that
     belong to the same character.

我们可以做一个简单的实验:

创建一个缓冲区,评估这个表达式:(insert "a" (- (max-char) 128) "b")

由于 Emacs 内部编码系统中的最大字节数为 5,因此 'a' 和 'b' 之间的字符为 5 个字节。(注意最后 128 个字符用于 8 位原始字节,它们的大小只有 2 个字节。)

然后定义和评估这个测试函数:

(defun test ()
  (interactive)
  (let ((max-bytes (1- (position-bytes (point-max)))))
    (message "%s"
             (loop for i from 1 to max-bytes collect (byte-to-position i)))))

我得到的是“(1 2 3 2 2 2 3)”。

列表中的数字表示缓冲区中的字符位置。因为有一个5字节的大字符,'1'和'3'之间应该有5个'2',但是'2'中的神奇'3'怎么解释呢?

4

1 回答 1

0

这是一个错误。我在 26.x 中不再看到这种行为。您可以在此处阅读有关它的更多信息(实际上引用了这个 SO question)。

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20783

于 2018-02-27T16:56:58.080 回答