Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Unicode Escapes (\uhhhh) #9

Open
tajmone opened this issue Jan 16, 2018 · 3 comments
Open

Add Unicode Escapes (\uhhhh) #9

tajmone opened this issue Jan 16, 2018 · 3 comments

Comments

@tajmone
Copy link
Collaborator

tajmone commented Jan 16, 2018

Sarebbe possibile implementare nella prossima release di Polygen il support per Unicode escape sequences?

Es: \u262E -> "☮"

Adottando la notazione delle C escape sequences: \uhhhh e \Uhhhhhhhh (dove hhhh ed hhhhhhhh sono numeri esadecimali a 4 e 8 cifre).

In teoria dovrebbe potersi implementare senza dover riscrivere porzioni enormi del codice, se l'output sarà in UTF-8 — che usa un solo byte per i caratteri Ascii, e 2 o più caratteri per quelli Unicode (e non richede il BOM).

Allo stato attuale, la presenza di caratteri Unicode nei commenti non genera problemi con Polygen (ho inserito tra i commenti frasi in ebraico ed arabo e polygen le ignora). Deduco che nel contesto dei commenti il parser li considera mere sequenze di byte su cui non fa controlli di alcun tipo.

Il vantaggio di usare escapes anziché HTML entities, oltre ad essere fruibili in output che non sia html, è che i caratteri generati con escapes possono essere resi maiuscoli dal backslash. Es:

(*   Le entità HTML non possono essere rese maiuscole con backslash.   *)
(*   I caratteri creati con Ascii escape sequence sì.                  *)

S ::=   "è" (*   => "è"   *) "\n"
        "È" (*   => "È"   *) "\n"
        "\232"     (*   => "è"   *) "\n"
      \ "\232"     (*   => "È"   *) ;

Il trucco di sopra funziona ovviamente solo con le lettere, ma include anche le lettere accentate (non so se sia implementato manualmente o da una libreria OCaml che si occupa delle stringhe e degli escapes, in quest'ultimo caso una libreria Unicode potrebbe estendere il trucchetto ad altri alfabeti che contemplano l'uso di maiuscole).

I caratteri dell'esempio sopra ("è" ed "È") sono ancora nel range 0-255, rappresentabili da un singolo carattere (rientrano nell'ambito Ascii "esteso", per così dire). Se Polygen fosse in grado di emettere caratteri Unicode con due o più byte, secondo UTF-8, si dovrebbe poter generare qualsiasi carattere.

Non so come funziona in OCaml, ma immagino vi siano delle librerie per gestire questo.

È vero che è attualmente possibile generare qualsiasi carattere Unicode usando la sua rappresentazione come entità &#??; o &#x??; (es. ק o ק = ק), ma questo ne limita l'uso all'HTML. (in realtà, facendo il piping dell output su pandoc impostandolo per la conversione a formato plain, questi convertirà le entità in caratteri Unicode, usando UTF-8, e può quindi essere usato come un filtro)

Per chi usa Polygen con la lingua italiana, il limite attuale dei caratteri Ascii (sia dentro che fuori le stringhe) rende problematico l'uso di lettere accentate (e ne usiamo tantissime). Se fosse possibile usare caratteri Unicode nel testo (dentro e fuori le stringhe) — o anche solo le lettere accentate (che sono pur sempre di un byte) — sarebbe stupendo, ma credo che questo implicherebbe modifiche al parser dato che il sorgente andrebbe interpretato con UCS2, usando due byte per ogni carattere — a meno che, ovviamente, il tutto non possa essere risolto tramite l'aggiornamento di una libreria.

@alvisespano
Copy link
Owner

alvisespano commented Jan 16, 2018 via email

@tajmone
Copy link
Collaborator Author

tajmone commented Jan 21, 2018

Ci sono già gli escape ASCII in Polygen, che 15 anni fa mi sembravano
sufficienti per rappresentare byte qualunque, quindi permettono
ipoteticamente di generare binari qualunque, ma le escape unicode sono
ancora meglio.

È verissimo, e sei stato lungimirante già all'epoca. Ho appena pubblicato un tutorial, con tanto di gramamtiche sorgenti da scaricare, che dimostra come produrre testo arabo con Polygen:

Il tutorial presenta due approcci:

  1. Usando le entità SGML
  2. Usando gli escape ASCII per creare un stream di byte UTF-8

Quindi, ad oggi è possibile genreare Unicode con Polygen.

Certo, è un po' macchinoso, ma basterebbe un piccolo applicativo per convertire le stringhe in ASCII escapes (una cosa realizzabile in mezz'ora, con tanto di GUI) per rendere la cosa una passeggiata.

Scrivendo questo tutorial mi è venuto in mente che l'implementazione delle escape Unicode dovrebbe produrre i corrispondenti byte UTF-8 (e non i codepoint Unicode).

@alvisespano
Copy link
Owner

alvisespano commented Jan 22, 2018 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants