Skip to content

Commit d6669ab

Browse files
committed
change default unicode error mode to "surrogateescape"
decoding change is compatible with vim vim does not do the encoding counterpart for some reason.
1 parent 16cdbc5 commit d6669ab

File tree

5 files changed

+20
-4
lines changed

5 files changed

+20
-4
lines changed

neovim/api/common.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""Code shared between the API classes."""
22
import functools
33

4+
from ..compat import unicode_errors_default
5+
46

57
class Remote(object):
68

@@ -156,7 +158,7 @@ def _identity(obj, session, method, kind):
156158
def decode_if_bytes(obj, mode=True):
157159
"""Decode obj if it is bytes."""
158160
if mode is True:
159-
mode = "strict"
161+
mode = unicode_errors_default
160162
if isinstance(obj, bytes):
161163
return obj.decode("utf-8", errors=mode)
162164
return obj

neovim/compat.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ def find_module(fullname, path):
3030

3131
# There is no 'long' type in Python3 just int
3232
long = int
33+
unicode_errors_default = 'surrogateescape'
3334
else:
3435
find_module = original_find_module
36+
unicode_errors_default = 'strict'
3537

3638
NUM_TYPES = (int, long, float)

neovim/msgpack_rpc/msgpack_stream.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from msgpack import Packer, Unpacker
55

6+
from ..compat import unicode_errors_default
67

78
logger = logging.getLogger(__name__)
89
debug, info, warn = (logger.debug, logger.info, logger.warning,)
@@ -19,7 +20,7 @@ class MsgpackStream(object):
1920
def __init__(self, event_loop):
2021
"""Wrap `event_loop` on a msgpack-aware interface."""
2122
self._event_loop = event_loop
22-
self._packer = Packer(use_bin_type=True)
23+
self._packer = Packer(unicode_errors=unicode_errors_default)
2324
self._unpacker = Unpacker()
2425
self._message_cb = None
2526

neovim/plugin/decorators.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import inspect
44
import logging
55

6-
from ..compat import IS_PYTHON3
6+
from ..compat import IS_PYTHON3, unicode_errors_default
77

88
logger = logging.getLogger(__name__)
99
debug, info, warn = (logger.debug, logger.info, logger.warning,)
@@ -141,7 +141,7 @@ def shutdown_hook(f):
141141
return f
142142

143143

144-
def decode(mode='strict'):
144+
def decode(mode=unicode_errors_default):
145145
"""Configure automatic encoding/decoding of strings."""
146146
def dec(f):
147147
f._nvim_decode = mode

test/test_buffer.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from nose.tools import with_setup, eq_ as eq, ok_ as ok
33
from test_common import vim, cleanup
44

5+
from neovim.compat import IS_PYTHON3
6+
57

68
@with_setup(setup=cleanup)
79
def test_get_length():
@@ -147,6 +149,15 @@ def test_mark():
147149
vim.command('mark V')
148150
eq(vim.current.buffer.mark('V'), [3, 0])
149151

152+
@with_setup(setup=cleanup)
153+
def test_invalid_utf8():
154+
vim.command('normal "=printf("%c", 0xFF)\np')
155+
eq(vim.eval("char2nr(getline(1))"), 0xFF)
156+
157+
eq(vim.current.buffer[:], ['\udcff'] if IS_PYTHON3 else ['\xff'])
158+
vim.current.line += 'x'
159+
eq(vim.eval("getline(1)", decode=False), b'\xFFx')
160+
eq(vim.current.buffer[:], ['\udcffx'] if IS_PYTHON3 else ['\xffx'])
150161

151162
@with_setup(setup=cleanup)
152163
def test_get_exceptions():

0 commit comments

Comments
 (0)