Re: byte order marker puzzle
Shiro Kawai <[email protected]> Tue, 5 Dec 2023 18:00:22 -1000
| Newsgroups | gmane.lisp.scheme.gauche |
|---|---|
| Message-ID | <CALN0JNGa5Cz41wR6XkkXNb18SA8t+Z2o4ah30KqxfkCU1pm57A@mail.gmail.com> |
Oh, it may cause an issue. As the legacy code opens a port with open-input-port, even if it wants to read binary. Dropping the beginning EF BB BF would disturb such code. BOM-dropping operation should be opt-in to keep backward compatibility. On Tue, Dec 5, 2023 at 5:57 PM Shiro Kawai <[email protected]> wrote: > Your assessment is correct. The file contains UTF-8 BOM, and Gauche does > not treat it specially, so the first string is actually "\xfeff;1". Using > BOM in utf-8 text stream is not recommended by the unicode standard, but > there are programs that generate them, so we should deal with it. > > For typical usage, the Right Thing may be to drop BOM when the file is > opened as a textual port, while keeping it if the file is opened as a > binary port. It may cause some confusion, for Gauche hasn't been treating > textual port and binary port differently, following Unix's "everything is a > byte stream" philosophy. It may be the time to move on, though. > > On the side note, I think 'write' should print U+FEFF (Zero width no-break > space) in escaped format, so that it is easier to find the character within > a string. > > > > > On Tue, Dec 5, 2023 at 3:40 PM Stephen Lewis <[email protected]> > wrote: > >> Shiro, >> I am having trouble with a text file that has a BOM >> (byte order mark) at the beginning. 'read-line' >> reads a string which appears to contain a number >> 'print' can print the number, but 'string->number' >> returns '#f'. It seems as if the BOM is somehow >> visible to 'string->number'. >> Here is a short test program and text file that >> shows the problem. Is this expected behaviour of >> 'read-line' and/or 'string->number'? Many programs >> treat the BOM like a magic number and read the >> file after the BOM. Am I doing something wrong? >> Stephen Lewis >> >> ==================================================== >> ;;; >> ;;; Odd behaviour of 'string->number' if BOM is present >> ;;; >> ;;; Stephen Lewis 3-dec 2023 >> ;;; >> >> (define (usage program-name) >> (format (current-error-port) >> "Usage: gosh ~a ./bom.txt\n" program-name) >> (exit 2)) >> >> (define (do-test args) >> (let1 fn (cadr args) >> (print "Input file \"" (string-scan-right fn "/" 'after) "\"") >> (call-with-input-file fn get-numbers) >> )) >> >> (define (get-numbers port) >> (until (read-line port) eof-object? => line >> (print "Line contains \"" line "\"") >> (print "Line is a string? " (string? line)) >> (print "Parses as number " (string->number line)))) >> >> (define (main args) >> (if (eq? (length args) 2) >> (do-test args) >> (usage (car args))) >> 0) >> ==================================================== >> >> This generates the test input file: >> echo "77u/MQ0KMg0KMw0K" | base64 -d > bom.txt >> >> Gauche version: >> gosh -V >> Gauche scheme shell, version 0.9.12 [utf-8,pthreads], x86_64-pc-linux-gnu >> (version "0.9.12") >> (command "gosh") >> (scheme.id gauche) >> (languages scheme r5rs r7rs) >> (encodings utf-8) >> (website "https://practical-scheme.net/gauche") >> (build.platform "x86_64-pc-linux-gnu") >> (build.configure "--prefix=/usr" "--build=x86_64-pc-linux-gnu" >> "--host=x86_64-pc-linux-gnu" "--mandir=/usr/share/man" >> "--infodir=/usr/share/info" "--datadir=/usr/share" "--sysconfdir=/etc" >> "--localstatedir=/var/lib" "--datarootdir=/usr/share" >> "--docdir=/usr/share/doc/gauche-0.9.12" >> "--htmldir=/usr/share/doc/gauche-0.9.12/html" "--libdir=/usr/lib64" >> "--enable-ipv6" "--with-ca-bundle=/etc/ssl/certs/ca-certificates.crt" >> "--with-slib=/usr/share/slib" "--with-tls=mbedtls" >> "build_alias=x86_64-pc-linux-gnu" "host_alias=x86_64-pc-linux-gnu" >> "CFLAGS=-O2 -pipe -mtune=native -march=native" "LDFLAGS=-Wl,-O1 >> -Wl,--as-needed" "--enable-multibyte=utf-8") >> (scheme.path "/usr/share/gauche-0.98/site/lib" >> "/usr/share/gauche-0.98/0.9.12/lib") >> (gauche.threads pthreads) >> (gauche.net.tls mbedtls) >> >> >> >> >> >> _______________________________________________ >> Gauche-devel mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/gauche-devel >> > _______________________________________________ Gauche-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/gauche-devel