mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
bpo-19865: ctypes.create_unicode_buffer() supports non-BMP strings on Windows (GH-14081)
This commit is contained in:
parent
21a92f8cda
commit
9765efcb39
3 changed files with 20 additions and 1 deletions
|
@ -274,7 +274,15 @@ def create_unicode_buffer(init, size=None):
|
||||||
"""
|
"""
|
||||||
if isinstance(init, str):
|
if isinstance(init, str):
|
||||||
if size is None:
|
if size is None:
|
||||||
size = len(init)+1
|
if sizeof(c_wchar) == 2:
|
||||||
|
# UTF-16 requires a surrogate pair (2 wchar_t) for non-BMP
|
||||||
|
# characters (outside [U+0000; U+FFFF] range). +1 for trailing
|
||||||
|
# NUL character.
|
||||||
|
size = sum(2 if ord(c) > 0xFFFF else 1 for c in init) + 1
|
||||||
|
else:
|
||||||
|
# 32-bit wchar_t (1 wchar_t per Unicode character). +1 for
|
||||||
|
# trailing NUL character.
|
||||||
|
size = len(init) + 1
|
||||||
buftype = c_wchar * size
|
buftype = c_wchar * size
|
||||||
buf = buftype()
|
buf = buftype()
|
||||||
buf.value = init
|
buf.value = init
|
||||||
|
|
|
@ -60,5 +60,14 @@ class StringBufferTestCase(unittest.TestCase):
|
||||||
self.assertEqual(b[::2], "ac")
|
self.assertEqual(b[::2], "ac")
|
||||||
self.assertEqual(b[::5], "a")
|
self.assertEqual(b[::5], "a")
|
||||||
|
|
||||||
|
@need_symbol('c_wchar')
|
||||||
|
def test_create_unicode_buffer_non_bmp(self):
|
||||||
|
expected = 5 if sizeof(c_wchar) == 2 else 3
|
||||||
|
for s in '\U00010000\U00100000', '\U00010000\U0010ffff':
|
||||||
|
b = create_unicode_buffer(s)
|
||||||
|
self.assertEqual(len(b), expected)
|
||||||
|
self.assertEqual(b[-1], '\0')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
:func:`ctypes.create_unicode_buffer()` now also supports non-BMP characters
|
||||||
|
on platforms with 16-bit :c:type:`wchar_t` (for example, Windows and AIX).
|
Loading…
Add table
Add a link
Reference in a new issue