ModernUO/Projects/Server
Kamron Batman 0404251638
feat: Adds Latin1 text support (#2317)
## Summary

- Adds proper Latin1 encoding support, replacing CP1252 usage throughout the codebase
- Adds specialized, optimized string decoding methods with safe string filtering for each encoding type
- Filters invalid Unicode characters (C0/C1 control codes, non-characters) by removal rather than replacement since
the UO client renders nothing for these characters
- Fixes UTF-16 null terminator position handling to correctly advance by 2 bytes

## Changes

TextEncoding.cs

- Added SearchValues-based invalid byte/char detection for efficient filtering
- Added encoding-specific GetString methods: GetStringAscii, GetStringLatin1, GetStringUtf8, GetStringBigUni,
GetStringLittleUni
- Each method supports a safeString parameter for filtering invalid characters
- Little-endian UTF-16 uses direct memory cast for zero-copy decoding on LE systems
- Invalid characters are removed (not replaced with U+FFFD) since the client renders nothing for them

SpanReader.cs

- Added ReadLatin1() and ReadLatin1Safe() methods
- Rewrote encoding-specific read methods to use optimized TextEncoding.GetString* methods
- Fixed UTF-16 null terminator handling: position now correctly advances by byteLength (2) instead of 1

SpanWriter.cs

- Added WriteLatin1 and WriteLatin1Null methods

## Packet Updates

- Updated all packet code to use Latin1 encoding instead of CP1252
- Affected: account packets, equipment packets, menu packets, message packets, mobile packets, player packets, secure
trade packets, vendor packets, gump packets, book packets, mahjong packets

## Filtering Behavior

Invalid characters filtered in safe mode:
```
┌───────────────┬────────────────────────┐
│     Range     │      Description       │
├───────────────┼────────────────────────┤
│ 0x00-0x1F     │ C0 control codes       │
├───────────────┼────────────────────────┤
│ 0x7F          │ DEL                    │
├───────────────┼────────────────────────┤
│ 0x80-0x9F     │ C1 control codes       │
├───────────────┼────────────────────────┤
│ 0xFFFE-0xFFFF │ Unicode non-characters │
└───────────────┴────────────────────────┘
```

Note: Surrogate pairs (0xD800-0xDFFF) are not filtered because proper validation requires context checking for paired
vs unpaired surrogates. The UO client renders nothing for these anyway.

## Test Plan

- All 631 Server.Tests pass
- Verified client rendering behavior using TestUnicodeGump command (pages 1-5)
- Confirmed U+FFFD, unpaired surrogates, and non-characters all render as blank in client
- Verified Latin1 characters (0xA0-0xFF) display correctly
- Verified C1 control codes (0x80-0x9F) are filtered and don't display
2026-01-22 15:51:00 -08:00
..
Buffers feat: Adds Latin1 text support (#2317) 2026-01-22 15:51:00 -08:00
Client chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Collections chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Comparers chore: Updates copyright (#1448) 2023-08-09 09:09:26 -07:00
Compression fix: Fixes libdeflate threading issue (#1813) 2024-06-02 15:02:47 -07:00
Configuration fix: Fixes idleCPU override (#2308) 2026-01-04 17:21:08 -08:00
Console fix: Console Input is disabled on Linux when no standard input is attached. (#1809) 2024-06-06 21:20:22 -07:00
ContextMenus fix: Moves ContextMenu out of core, streamlines code, fixes bugs (#1873) 2024-07-20 21:33:23 -07:00
Events fix: Fixes networking issues (#1958) 2024-09-19 16:54:49 -07:00
Exceptions chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
GarbageCollection chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Geometry fix: Fixes zero height spawners and normalizes spawn bounds before use. (#2301) 2025-12-31 10:25:42 -08:00
Items feat: Adds new decay system and SkipSerialization (#2311) 2026-01-08 11:43:51 -08:00
Json feat: Add spawn position caching and spiral scan optimization (#2295) 2025-12-28 02:40:21 -08:00
Localization chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Maps refactor: Add BitMask256 utility for 256-bit bitmask operations (#2300) 2025-12-29 12:54:49 -08:00
Menus fix: Cleans up core code (#1187) 2022-10-10 21:47:08 -07:00
Migrations fix: Moves containers/bods/traps/etc to serialization generator (#2310) 2026-01-07 21:55:55 -08:00
Mobiles feat: Adds OnThirstChanged (#2313) 2026-01-13 17:04:41 -08:00
Network feat: Adds Latin1 text support (#2317) 2026-01-22 15:51:00 -08:00
PropertyList chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Random chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Regions fix: Eliminates List allocations in various places. (#2158) 2025-11-16 18:33:53 -08:00
Serialization feat: Adds new decay system and SkipSerialization (#2311) 2026-01-08 11:43:51 -08:00
Targeting chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Text feat: Adds Latin1 text support (#2317) 2026-01-22 15:51:00 -08:00
TileMatrix feat: Updates to .NET 9 (#1984) 2024-12-08 10:16:34 -08:00
Timer chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
TimeZones fix: Fixes order of execution with AutoSave and TZ (#1665) 2024-01-24 17:17:45 -08:00
Utilities fix: Exempts localhost from IPLimiter. Preps testing for io_uring (#2316) 2026-01-20 08:54:15 -08:00
World feat: Adds new decay system and SkipSerialization (#2311) 2026-01-08 11:43:51 -08:00
AssemblyHandler.cs chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Attributes.cs fix: Fixes props for interfaces and adds account manipulation (#2179) 2025-05-09 15:39:47 -07:00
CityInfo.cs chore: Updates copyright (#1448) 2023-08-09 09:09:26 -07:00
Commands.cs fix: Fixes adding items with ambiguous type lookup (#2307) 2026-01-06 21:21:29 -08:00
Effects.cs chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
EntityFinalizationTracker.cs feat: Adds an Item/Mobile memory leak detector. Fixes minor leak in doors. (#2159) 2025-04-15 19:14:45 -07:00
EventLoopTasks.cs chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
ExpansionInfo.cs chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Guild.cs chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
HuePicker.cs fix: Cleans up core code (#1187) 2022-10-10 21:47:08 -07:00
IAccount.cs fix: Fixes looking up accounts that were renamed. (#2078) 2025-01-18 17:11:43 -08:00
IEntity.cs feat: Upgrades serialization v4 (Threaded Heap Serialization) (#1947) 2024-09-14 09:57:43 -07:00
Interfaces.cs feat: Add CanSpawnMobile overload with props Z-range support. (#2293) 2025-12-27 17:01:15 -08:00
IVirtualCheckGump.cs feat: Moves gumps out of the core (#1916) 2024-08-09 19:07:32 -07:00
KeywordList.cs fix: Cleans up core code (#1187) 2022-10-10 21:47:08 -07:00
Main.cs fix: Fixes idleCPU override (#2308) 2026-01-04 17:21:08 -08:00
MessageType.cs fix: Moves the rest of the Incoming packets (#1338) 2023-02-10 22:59:36 -08:00
Module.cs fix: Fixes sending packets and sidesteps a major issue with stackalloc and PGO in .NET 8 (#1607) 2023-11-21 12:18:20 -08:00
MultiData.cs chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
Party.cs fix: Cleans up core code (#1187) 2022-10-10 21:47:08 -07:00
Poison.cs fix: Adds ISpanParsable and fixes command conditionals (#1241) 2022-11-12 00:26:02 -08:00
Prompt.cs fix: Cleans up core code (#1187) 2022-10-10 21:47:08 -07:00
Race.cs fix: Fixes TryParse for Race (#1244) 2022-11-12 00:31:25 -08:00
SecureTrade.cs feat: Moves gumps out of the core (#1916) 2024-08-09 19:07:32 -07:00
Serial.cs feat: Updates to .NET 9 (#1984) 2024-12-08 10:16:34 -08:00
Server.csproj feat: Adds Latin1 text support (#2317) 2026-01-22 15:51:00 -08:00
Skills.cs chore: Use var everywhere (#2294) 2025-12-27 16:47:28 -08:00
TileData.cs feat: Add CanSpawnMobile overload with props Z-range support. (#2293) 2025-12-27 17:01:15 -08:00
TileList.cs fix: Refactors getting static tiles to use enumerators (#1611) 2023-11-26 09:39:46 -08:00