Skip to content

Commit 2c0cb81

Browse files
committed
Merge pull request #199 from bfredl/unicode_errors
change default unicode error mode to "surrogateescape"
2 parents 16cdbc5 + d6669ab commit 2c0cb81

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)