[llvm-strings] Add --encoding={s,S,utf8} option
The Issue & Context
Before this PR, llvm-strings lacked a dedicated --encoding option to specify ASCII, locale-based, or UTF-8 encodings, limiting its ability to correctly interpret non-ASCII strings or match GNU strings behavior in various locales.
Root Cause Analysis
The original llvm-strings implementation assumed a single default character set without explicit encoding selection, causing it to misinterpret bytes when dealing with different character encodings or locales. The code did not differentiate between ASCII-only, locale-dependent character sets, or UTF-8, leading to incorrect string extraction especially for non-ASCII data.
Solution Strategy & Architectural Pattern
This PR introduces a new --encoding option with three values: 's' for ASCII-only (rejecting bytes with the high bit set), 'S' for the locale's character set (default, POSIX-compliant), and 'utf8' for UTF-8 encoding. The implementation updates llvm-strings.cpp to parse this option and adjust string extraction logic accordingly, aligning behavior closer to GNU strings and POSIX standards. It also adds tests and documentation to cover these encoding modes.
Key Takeaway for Contributors
When dealing with string extraction from binary data, explicitly handling character encodings and locale settings is crucial to correctly interpret multi-byte or non-ASCII characters; relying on a single default encoding can cause subtle bugs and interoperability issues.