Arabo: Unicode ‘source’ alla visualizzazione finale Unicode

domanda semplice:

questa è la stringa di visualizzazione finale che sto cercando

لعبة ديدة

ora sotto c’è ognuno dei personaggi separati, prima di essere “incollati” insieme (quindi ho messo uno spazio tra ciascuno per fermare l’unione)

ل ع ب ة د ي د ة

nota come NON sono gli stessi personaggi, c’è una magica trasformazione che li fonde e li converte in nuovi caratteri Unicode.

e poi in quello sopra, i personaggi appaiono in realtà da destra a sinistra (nella memoria, sono lasciati a destra)

quindi la mia semplice domanda è questa: dove ottengo una funzione c / c ++ indipendente dalla piattaforma che prenderà la mia stringa Unicode a 16 bit sorgente, e farò la trasformazione su di essa per ottenere la stringa Unicode che creerà quella prima citata sopra? facendo la conversione RTL e l’unione?

questo è tutto ciò che voglio, una funzione che lo fa.

AGGIORNARE:

ok, sì, so che i ‘personaggi’ sono gli stessi nei due esempi sopra, sono le stesse ‘lettere’ ma (guardando in chrome, o IE più recente) chiunque può vedere CHIARAMENTE che i glifi sono diversi. ora sono abbastanza fiducioso che questa trasformazione che deve essere eseguita può essere eseguita a livello di unicode, perché il mio file di font e lo standard unicode, sembra specificare i diversi glifi sia per le versioni separate, sia per le varie versioni unite dei caratteri /lettere. (unicode.org/charts/PDF/UFB50.pdf unicode.org/charts/PDF/UFE70.pdf)

quindi, posso semplicemente inserire il mio unicode in una funzione e far uscire l’unicode trasformato?

La conversione di join e RTL non si verifica a livello di caratteri Unicode.

In altre parole: l’ ordine dei caratteri e i codepoint non codificati effettivi non vengono modificati durante questo processo.

In effetti, le transizioni RTL / LTR di fusione e gestione sono gestite dal motore di rendering del testo.

Questa citazione dall’articolo di Wikipedia sull’alfabeto arabo lo spiega abbastanza bene:

Infine, la codifica Unicode dell’arabo è in ordine logico , ovvero i caratteri vengono inseriti e archiviati nella memoria del computer, nell’ordine in cui sono scritti e pronunciati senza preoccuparsi della direzione in cui verranno visualizzati su carta o su lo schermo. Anche in questo caso, è lasciato al motore di rendering di presentare i caratteri nella direzione corretta, utilizzando le funzionalità di testo bidirezionale di Unicode. A questo proposito, se le parole arabe in questa pagina sono scritte da sinistra a destra, è un’indicazione che il motore di rendering Unicode utilizzato per visualizzarle non è aggiornato.

L’elaborazione che stai cercando si chiama legatura . A differenza di molti linguaggi basati sul latino, dove puoi semplicemente mettere un carattere dopo l’altro per rendere il testo, le legature sono fondamentali in arabo. La sostituzione viene eseguita nel motore di rendering del testo e le informazioni sulle legature sono generalmente memorizzate in file di font.

nota come NON sono gli stessi personaggi

Sono gli stessi per un lettore arabo. È ancora leggibile. Non c’è alcuna trasformazione da fare sul tuo testo sorgente Unicode16. Devi fornire l’intera stringa al tuo renderer di testo. In C / C ++, e come stai andando in modo indipendente dalla piattaforma, puoi usare Pango per il rendering.

Nota: forse volevi scrivere لعبة جديدة (cioè un nuovo gioco)? Perché ciò che dai come esempio non ha significato in arabo.

Mi rendo conto che questa è una domanda vecchia, ma quello che stai cercando è FriBidi , l’implementazione GNU dell’algoritmo bidirezionale Unicode .

Questo programma fa la selezione di glifi richiesta nella domanda, oltre a gestire il testo bidirezionale (combinazione di testo da destra a sinistra e da sinistra a destra).

Quello che stai cercando è un algoritmo di sintesi di script arabi. Non sono consapevole che esista come open source. Se arrivi a uno, per favore pubblica.

Alcuni punti:

A livello di archiviazione, non esiste una trasformazione Unicode. C’è una rappresentazione astratta della stringa come sottolineato da altre risposte.

A livello di rendering, è ansible scegliere di utilizzare i moduli di presentazione Unicode, ma è anche ansible scegliere di utilizzare altri moduli. I moduli di presentazione Unicode non sono uno standard per la codifica dell’output di presentazione, piuttosto sono solo un esempio di codici di presentazione che possono essere emessi dal motore di rendering utilizzando la sintesi di script.

Per renderlo più chiaro: non ci sarebbe una singola trasformata standard (cioè un algoritmo di sintesi) che si trasformsrebbe da A a B, dove A è la pagina standard in arabo Unicode e B è standard Unicode Arabic Presentation Forms. Piuttosto, ci sarebbero trasformazioni diverse che possono variare in complessità e possono avere diversi sistemi di codifica per B, ma una delle codifiche che possono essere usate per B è l’Unicode Presentation Forms. Ad esempio, un semplice stile di macchina da scrivere richiederebbe un semplice algoritmo di rendering che non richiederebbe Presentation Forms. In effetti esistono stili di scrittura moderni (non in comune però) dove A e B sono in realtà identici, solo che una pagina di font diversa sarebbe stata usata per eseguire il rendering. D’altra parte, la trasformazione per il rendering di composizione tipografica o di forms calligrafiche tradizionali sarebbe più complessa e richiederebbe qualcosa di simile ai moduli di presentazione Unicode.

Ecco un paio di indicazioni per ulteriori informazioni sull’argomento:

Per ulteriori informazioni, visitare: http://www.fileformat.info/info/unicode/block/arabic_presentation_forms_b/list.htm e dare un’occhiata a questo repo: https://github.com/Accorpa/Arabic-Converter-From-and- per-Arabo-Presentazione-forms-B