Re: utf-8 output in a terminal

"R. Matthew Emerson" <[email protected]> Sun, 28 Jul 2024 19:14:32 -0700
Newsgroups gmane.lisp.openmcl.devel
Message-ID <[email protected]>

> On Jul 28, 2024, at 6:31=E2=80=AFPM, Gr=C3=A9gory Vanuxem =
<[email protected]> wrote:
>=20
> Found!
>=20
> In level-0/l0-misc.lisp there is exactly what i was looking for.
> (ccl::%get-utf-8-cstring ..) It's a pity I think it is not documented
> since now UTF-8 is relatively widely used.
>=20
> All is right now!


The exported functionality is ccl:get-encoded-string.

(get-encoded-string :utf-8 cname (#_strlen cname))

https://ccl.clozure.com/docs/ccl.html#f_get-encoded-string

The manual also contains examples of using both ccl:with-encoded-cstrs =
and ccl:get-encoded-string:

https://ccl.clozure.com/docs/ccl.html#brief-examples



>=20
> Thanks
>=20
> Greg
>=20
> Le lun. 29 juil. 2024 =C3=A0 01:34, Gr=C3=A9gory Vanuxem =
<[email protected]> a =C3=A9crit :
>>=20
>> Hello Matthew,
>>=20
>> Le dim. 28 juil. 2024 =C3=A0 07:31, R. Matthew Emerson =
<[email protected]> a =C3=A9crit :
>>>=20
>>>=20
>>>=20
>>>> On Jul 27, 2024, at 8:23=E2=80=AFPM, Gr=C3=A9gory Vanuxem =
<[email protected]> wrote:
>>>>=20
>>>> In FriCAS  built on top of Clozure CL I obtain this output in a =
terminal (WSL2)
>>>>=20
>>>> (gamma(x) =C3=83=C3=82=C2=A2=C3=83=C3=82=C3=83=C3=82 reals && Re(x) =
> 0) || (x =C3=83=C3=82=C2=A2=C3=83=C3=82=C3=83=C3=82 integers &&
>>>> gamma(x) =C3=83=C3=82=C2=A2=C3=83=C3=82=C3=83=C3=82 reals)
>>>>=20
>>>> instead of (SBCL)
>>>>=20
>>>> (gamma(x) =E2=88=88 reals && Re(x) > 0) || (x =E2=88=89 integers && =
gamma(x) =E2=88=88 reals)
>>>>=20
>>>> if I (print ...) a string with, for example, =E2=88=88, in a pure =
Clozure CL
>>>> (recently git cloned) this is correctly printed, no problem.
>>>>=20
>>>> So I wonder if I have to modify the output stream character =
encoding
>>>> or the output routine.
>>>=20
>>> Check that the external format of the FriCAS output stream is what =
you expect. In other words, if you pass an explicit :external-format =
argument to cl:open, make sure it matches what your terminal requires.
>>=20
>> I don't think it is at this stage in fact, I was wrong. Better
>> checking what is going on, since the string comes from C (sorry I
>> forgot to mention that) I tend to think my problem comes from
>> ccl::%get-cstring. Tracing it seems to show it's not "decoding" it =
and
>> considers it as a 8859-1 string. But to test this i.e. force CCL to
>> use :utf8 format to "read it" I have not found. There is no option
>> from what I know to get-cstring like :external-format and using
>> with-encoded-cstrs does not seem to work.
>>=20
>> Right now I am using some FFI macros from FriCAS to simplify my code,
>> I will try to revert to pure CCL code first to check my claims,
>> TIMTOWTDI.
>>=20
>>> Doing (describe *terminal-io*) might show something interesting. =
Here=E2=80=99s what it shows for me:
>>>=20
>>> ? (describe *terminal-io*)
>>> #<ECHOING-TWO-WAY-STREAM input #<BASIC-CHARACTER-INPUT-STREAM UTF-8 =
(TTY/0) #x1824C7D6>, output #<BASIC-CHARACTER-OUTPUT-STREAM UTF-8 =
(TTY/1) #x1824C2A6> #x1825FBE6>
>>> Class: #<STANDARD-CLASS ECHOING-TWO-WAY-STREAM>
>>> Wrapper: #<CLASS-WRAPPER ECHOING-TWO-WAY-STREAM #x18039A16>
>>> Instance slots
>>> SHARED-RESOURCE: NIL
>>> OPEN-P: T
>>> INPUT-STREAM: #<BASIC-CHARACTER-INPUT-STREAM UTF-8 (TTY/0) =
#x1824C7D6>
>>> OUTPUT-STREAM: #<BASIC-CHARACTER-OUTPUT-STREAM UTF-8 (TTY/1) =
#x1824C2A6>
>>>=20
>>> The default external format has been #<EXTERNAL-FORMAT :UTF-8/:UNIX =
#x18249C6E> for quite a long time now.
>>>=20
>>> =
https://ccl.clozure.com/docs/ccl.html#characters-and-external-formats
>>=20
>> This is exactly what I have when I use this function in FriCAS. I =
have
>> read the documentation and the internal utf32 representation but here
>> I am stuck. This is not the most important thing I need to do but it
>> will be imperative for some next stuff.
>>=20
>> In anyway, thanks!
>>=20
>> Greg
>>=20
>>>=20
>>>>=20
>>>> And more importantly, how can I achieve that?
>>>>=20
>>>> - Greg
>>>>=20
>>>> PS:
>>>> (1) -> )lisp CCL:*DEFAULT-EXTERNAL-FORMAT*
>>>> Value =3D :UNIX
>>>=20