guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: filename(CJK utf8) problem on OSX.


From: Alex Vong
Subject: Re: filename(CJK utf8) problem on OSX.
Date: Mon, 28 Mar 2016 12:59:07 +0800
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Park SungMin <address@hidden> writes:

> follow code….. I just test openfile(CJK filename).
> "open-file" and "call-with-input-file" are raise error.  so I test use low 
> C(Posix) API, then run ok!
> I don’t know is it bug? or option problem?
>  
>
> (use-modules  (rnrs io ports)
>                       (rnrs bytevectors)
>                       (system foreign)
>                       (ice-9 rdelim))
>
> (fluid-set! %default-port-encoding "utf-8")
> (set-port-encoding! (current-output-port) "utf-8")
> (set-port-encoding! (current-input-port) "utf-8")
>
> (define filename "/Users/byul/Desktop/사진.gif")
>
> (define my-open-file
>   (lambda (filename)
>     (let* ((fd ((pointer->procedure
>                int
>                (dynamic-func "open" (dynamic-link))
>                (list '* int))
>               (bytevector->pointer
>                (string->utf8 filename))
>               O_RDONLY)))
>       (when (= fd -1)
>       (throw 'can't-find-file))
>       (fdes->inport fd))))
>
> (define port (my-open-file filename))
>
> (get-bytevector-n port 10)  ;; OK. I get bytevector.
>
> ;;but….
> (file-exists? filename) ;; #f
> (open-file filename "r") ; ERROR: In procedure open-file: No such file or 
> directory: "/Users/byul/Desktop/사진.gif"

I cannot reproduce it on GNU/Linux. Perhaps others know what's going
wrong. For now, you could try setting port encoding to "UTF-8" instead
of "utf-8". Also, I remember OS X ships an ancient version of libiconv,
maybe you can try installing the latest version.

(use-modules  (rnrs io ports)
                        (rnrs bytevectors)
                        (system foreign)
                        (ice-9 rdelim))

(fluid-set! %default-port-encoding "utf-8")
(set-port-encoding! (current-output-port) "utf-8")
(set-port-encoding! (current-input-port) "utf-8")

(define filename "/home/alexvong1995/사진.gif")
(system* "touch" filename) ;; create the file if not exist
;;; $1 = 0

(define my-open-file
  (lambda (filename)
    (let* ((fd ((pointer->procedure
                 int
                 (dynamic-func "open" (dynamic-link))
                 (list '* int))
                (bytevector->pointer
                 (string->utf8 filename))
                O_RDONLY)))
      (when (= fd -1)
        (throw 'can't-find-file))
      (fdes->inport fd))))

(define port (my-open-file filename))

(get-bytevector-n port 10)
;;; $2 = #<eof>

(file-exists? filename)
;;; $3 = #t

(open-file filename "r")
;;; $4 = #<input: /home/alexvong1995/사진.gif 10>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]