find-unicode-control
These scripts look for non-printable unicode characters in all text files in a
source tree. find-unicode-control should work with python2 as well as
python3. It uses python-magic if available to determine file type, or simply
spawns the file --mime-type command. They should be functionally the same
and find-unicode-control could eventually get disposed.
Installation
pip3 install .
Usage
usage: find-unicode-control [-h] [-p {all,bidi}] [-v] [-c CONFIG] path [path ...]
Look for Unicode control characters
positional arguments:
path Sources to analyze
optional arguments:
-h, --help show this help message and exit
-p {all,bidi}, --nonprint {all,bidi}
Look for either all non-printable unicode characters or bidirectional control characters.
-v, --verbose Verbose mode.
-d, --detailed Print line numbers where characters occur.
-t, --notests Exclude tests (basically test.* as a component of path).
-c CONFIG, --config CONFIG
Configuration file to read settings from.
If unicode BIDI control characters or non-printable characters are found in a file, it will print output as follows:
$ find-unicode-control -p bidi *.c
commenting-out.c: bidirectional control characters: {'\u202e', '\u2066', '\u2069'}
early-return.c: bidirectional control characters: {'\u2067'}
stretched-string.c: bidirectional control characters: {'\u202e', '\u2066', '\u2069'}
Using the -d flag, the output is more detailed, showing line numbers in
files, but this mode is also slower:
find-unicode-control -p bidi -d .
./commenting-out.c:4 bidirectional control characters: ['\u202e', '\u2066', '\u2069', '\u2066']
./commenting-out.c:6 bidirectional control characters: ['\u202e', '\u2066']
./early-return.c:4 bidirectional control characters: ['\u2067']
./stretched-string.c:6 bidirectional control characters: ['\u202e', '\u2066', '\u2069', '\u2066']
The optimal workflow would be to do a quick scan through a source tree and if any issues are found, do a detailed scan on only those files.
Configuration file
If files need to be excluded from the scan, make a configuration file and
define a scan_exclude variable to a list of regular expressions that match
the files or paths to exclude. Alternatively, add a scan_exclude_mime list
with the list of mime types to ignore; this can again be a regular expression.
Here is an example configuration that glibc uses:
scan_exclude = [
# Iconv test data
r'/iconvdata/testdata/',
# Test case data
r'libio/tst-widetext.input$',
# Test script. This is to silence the warning:
# 'utf-8' codec can't decode byte 0xe9 in position 2118: invalid continuation byte
# since the script tests mixed encoding characters.
r'localedata/tst-langinfo.sh$']
Notes
This script was quickly hacked together to scan repositories with mostly LTR,
unicode content. If you have RTL content (either in comments, literals or even
identifiers in code), it will give false warnings that you need to weed out.
For now you need to exclude such RTL code using scan_exclude but a long term
wish list (if this remains relevant, hopefully more sophisticated RTL
diagnostics will make it obsolete!) is to handle RTL a bit more intelligently.
Metadata
Release files for find-unicode-control 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| find_unicode_control-0.1.1.tar.gz | 7.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| find_unicode_control-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.1 kB
Release files / find_unicode_control-0.1.1.tar.gz
| Download URL | find_unicode_control-0.1.1.tar.gz |
|---|---|
| Size | 7.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5dfcbc2460c7754e6f17aa6a7ea4ad4436c9c825928fb75835a19d91ca1d7d83
|
|
BLAKE2b-256 checksum How to use checksums |
35000e2d5e20773e8b002267abc01b2a045e05f67bd0affe2f32bcb53eda2764
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / find_unicode_control-0.1.1-py3-none-any.whl
| Download URL | find_unicode_control-0.1.1-py3-none-any.whl |
|---|---|
| Size | 8.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c831e7eb3d3726a8537600546cab4f9a9adb24e181b8f8373dfae55bfdf86932
|
|
BLAKE2b-256 checksum How to use checksums |
57f43e15185a82523080b5d210a849693cfbfbc14dd4d1d52dcf9e28272b4ca3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Security for find-unicode-control 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.