David Kastrup <[email protected]> writes:
> Run the following code in an UTF-8 capable locale:
>
> (setlocale LC_ALL "")
> (use-modules (rnrs io ports) (rnrs bytevectors) (ice-9 format))
> (let ((p (open-bytevector-input-port
> (u8-list->bytevector '(#xc3 #x9f #xc3 #X9f)))))
> (format #t "~a ~a\n" (port-encoding p) (binary-port? p))
> (format #t "#x~x\n" (char->integer (read-char p)))
> (format #t "~a ~a\n" (port-encoding p) (binary-port? p))
> (set-port-encoding! p "ISO-8859-1")
> (format #t "~a ~a\n" (port-encoding p) (binary-port? p))
> (format #t "#x~x\n" (char->integer (read-char p)))
> (format #t "~a ~a\n" (port-encoding p) (binary-port? p)))
>
> This results in the output
> #f #t
> #xdf
> #f #t
> ISO-8859-1 #f
> #xc3
> ISO-8859-1 #f
>
> The manual, however, states:
>
> -- Scheme Procedure: port-encoding port
> -- C Function: scm_port_encoding (port)
> Returns, as a string, the character encoding that PORT uses to
> interpret its input and output. The value â#fâ is equivalent to
> â"ISO-8859-1"â.
>
> That would appear to be false since the value #f here is treated as
> equivalent to "UTF-8" rather than "ISO-8859-1".
This is indeed a bug, introduced in Guile 2.0.9. The workaround is to
explicitly set the encoding to "ISO-8859-1".
Mark