Parsing ACH files from the Fed with moov-io/ach's Reader worked for ASCII files, but files containing UTF-8 names (e.g. John DèS) came out garbled: è showed up as è. The reporter's analysis: the charset detection library only inspects the first 1024 bytes of the file. If those are all plain ASCII (0-7F), it decides the file is Windows-1252 and decodes the UTF-8 bytes as Latin-1, even when real UTF-8 characters appear later in the file.
moov-io/ach Reader garbles UTF-8 names (è becomes Ãè)
The root cause was the encoding sniffing: golang.org/x/net/html/charset looks at only the first 1024 bytes, so a file whose first 1024 bytes are pure ASCII gets decoded as Windows-1252 even if it contains UTF-8 later. The maintainer fixed this in PR #1574, released in v1.46.0, and the reporter confirmed 1.46.0 fixed their issue.
If you cant upgrade: the reporter found that converting the UTF-8 content to Windows-1252 before handing it to ach.NewReader() parses correctly, since the reader's charset handling then round-trips it back properly. But upgrading to v1.46.0+ is the real fix.
Source: https://github.com/moov-io/ach/issues/1564
Source: https://github.com/moov-io/ach/issues/1564