Ryan Malloy
bea1a1cd0c
Phase 20: UTF-8/multibyte locale support (2026.05.04.4)
Thread CLIENT_LOCALE through to user-data string codecs. Driver previously
hardcoded iso-8859-1 for all string conversions, which broke any locale
outside Western European code points.
* Connection.encoding property derived from client_locale via
_python_encoding_from_locale (en_US.utf8 -> utf-8, en_US.8859-1 ->
iso-8859-1, etc.)
* encode_param / decode / parse_tuple_payload accept an encoding
parameter; cursor and fast-path call sites forward conn.encoding
* Smart-LOB CLOB encode/decode and TEXT decode honor connection encoding
* DataError raised for non-representable chars; cursor releases the
prepared statement before propagating so connection state stays clean
Boundary discipline: protocol-level strings (cursor names, function
signatures, SQ_FILE fnames, error near-tokens, SQL text) stay
iso-8859-1 (always ASCII, never user-controlled).
9 new integration tests in tests/test_unicode.py covering ASCII
round-trip, Latin-1 high-bit, full byte range, locale-mapping,
encoding property, UTF-8 negotiation, multibyte (skipped without
IFX_UTF8_DATABASE), DataError on non-representable, CLOB round-trip.
Total: 69 unit + 212 integration = 281 tests.
2026-05-04 17:13:19 -06:00
..
2026-05-04 13:26:15 -06:00
2026-05-02 19:10:24 -06:00
2026-05-04 16:57:06 -06:00
2026-05-04 12:54:02 -06:00
2026-05-02 19:10:24 -06:00
2026-05-04 14:58:19 -06:00
2026-05-04 13:26:15 -06:00
2026-05-04 13:13:55 -06:00
2026-05-04 14:30:44 -06:00
2026-05-04 12:09:16 -06:00
2026-05-04 12:09:16 -06:00
2026-05-04 12:54:02 -06:00
2026-05-04 12:54:02 -06:00
2026-05-04 14:36:21 -06:00
2026-05-04 12:30:48 -06:00
2026-05-04 12:22:07 -06:00
2026-05-04 12:22:07 -06:00
2026-05-04 11:11:50 -06:00
2026-05-04 13:13:55 -06:00
2026-05-03 15:37:10 -06:00
2026-05-04 14:50:27 -06:00
2026-05-02 19:10:24 -06:00
2026-05-04 16:57:06 -06:00
2026-05-04 16:41:25 -06:00
2026-05-04 15:51:24 -06:00
2026-05-04 07:55:13 -06:00
2026-05-04 14:14:37 -06:00
2026-05-04 14:14:37 -06:00
2026-05-04 14:14:37 -06:00
2026-05-04 10:54:32 -06:00
2026-05-04 14:46:53 -06:00
2026-05-04 12:54:02 -06:00
2026-05-04 17:13:19 -06:00