Ncurses ed UTF-8, capire quante celle servono per il carattere.

Stato
Discussione chiusa ad ulteriori risposte.

meh.

Utente Silver
12 Giugno 2009
15
1
0
60
Codice:
ß => 11000011 10011111
â—• => 11100010 10010111 10010101
æ­» => 11100110 10101101 10111011
ã￾— => 11100011 10000001 10010111

A primo e secondo serve una cella, a terzo e quarto 2 celle, qualcuno sa se c'e' una funzione gay nelle ncurses o altro modo per sapere quante celle usare?

Senza cio' usando caratteri giapponesi si rompe tutto ._·

Edit: vedendo un attimo la lista di char unicode solo il giapponese ha bisogno di due celle, ma non saprei comunque come riconoscere che sto avendo a che fare con un char giapponese ·_.

HALP

Edit: Siccome almeno 2 persone non hanno capito cosa chiedevo, cerco di spiegarlo piu' chiaramente:

Sto scrivendo una readline, se un char ha bisogno di 2 celle, fare un move(0, cursor+1) risulta nell'avere il cursore sempre sopra il char, invece che dopo, e di conseguenza i put seguenti risultano nel fottere completamente la riga di input.

Quello che mi serve e' un modo per sapere quante celle usa un carattere.
 
In teoria ti dovrebbe bastare settare LC_ALL a "", usare wchar_t come tipo di char, wcs come tipo stringa, addwstr() per addare la stringa e wcslen() per calcolare la lunghezza invece di strlen(), e sei felice, non hai bisogno di fare magie nere con le lunghezze dei blocchi. O almeno, questo è quello che assicurano i dev di NCurses. Se così non è, sei autorizzato a incazzarti con loro.
 
BlackLight ha detto:
In teoria ti dovrebbe bastare settare LC_ALL a "", usare wchar_t come tipo di char, wcs come tipo stringa, addwstr() per addare la stringa e wcslen() per calcolare la lunghezza invece di strlen(), e sei felice, non hai bisogno di fare magie nere con le lunghezze dei blocchi. O almeno, questo è quello che assicurano i dev di NCurses. Se così non è, sei autorizzato a incazzarti con loro.

Eh, avevo letto anche io in giro di wcslen, pero' a parte il fatto che sto usando ruby e non ho wcslen, il seguente source printa 8:

Codice:
wchar_t* lol = L"â—•Ã￾æ­»";
printf("%u\n", wcslen(lol));

Che e' perfettamente logico visto che sono 8 byte, peccato che in totale richiedano 4 celle, e non 8, e che il numero di byte non sia collegato al numero di celle richieste.

Ora, a meno che quel source non sia sbagliato, wcslen e' perfettamente inutile ed io devo leggermi i source di irssi per capire che magie nere fa.
 
http://shurizzle.gotdns.org/sources/C/utf8_to_utf32/libutf.so-0.1.tar.gz
(non installarlo, vedi il source)
http://sprunge.us/MdHd?c
RESULT:
Codice:
len: 3
<3
 
shura ha detto:
http://shurizzle.gotdns.org/sources/C/utf8_to_utf32/libutf.so-0.1.tar.gz
(non installarlo, vedi il source)
http://sprunge.us/MdHd?c
RESULT:
Codice:
len: 3
<3

Peccato che il risultato dovrebbe essere 4 :)

Il kanji usa 2 celle, mentre gli altri due char 1, mi serve sapere di quante celle ha bisogno un carattere.

Ad ottenere la lunghezza in caratteri di una stringa utf-x son capaci tutti.
 
shura ha detto:
e allora fai una funzione gay no? (non lo sapevo che il kanji usa 2 celle sinceramente :omfg:)

Eh ok, e' quello che dovrei fare, ma vedi, in un blocco (inteso come gruppo di caratteri unicode) non tutti i char usano piu' di una cella, per vedere la differenza basta che copinciolli i char nell'esempio in alto in un terminale e vedrai che quelli giapponesi hanno il cursore che e' il doppio degli altri.

Insomma, o mi faccio una lista di tutti i caratteri omosessuali (cosa orrenda), o lo prendo in culo, quello che non capisco e' che _IN TEORIA_ ncursesw _DOVREBBE_ fare in automatico queste cose, se no perde completamente il senso di esistere.

In succo, sono convinto che ci sia gia' una funzione che fa sta cosa, solo che non lo so ancora.
 
shura ha detto:
_DOVREBBE_, hai detto bene, se trovo qualcosa ti avviso <3 tu fatti vedere in giro su irc però :(

Eh, staro' nel futuro IRC di Unit-X, ma tanto sparisco fino all'8 aprile.

Se scopri qualcosa scrivi qui e leggero' quando torno ^_^

KTHXBYE.
 
so che sembra stupido linkare wikipedia ma mi serve la tabella come reference:
http://it.wikipedia.org/wiki/UTF-8#Descrizione

da quanto sopra:
1 carattere : x & 0x80 == 0x00
2 caratteri : x & 0xe0 == 0xb0
3 caratteri : x & 0xf0 == 0xe0
4 caratteri : x & 0xf8 == 0xf0
 
http://sprunge.us/VXBS?c così non si sovrappongono i caratteri però non sono riuscito a scoprire come prendere la grandezza o_O

EDIT: http://sprunge.us/ZdKi?c
let's try
mi sono letto i sources delle ncursesw :D
 
Chuzz ha detto:
so che sembra stupido linkare wikipedia ma mi serve la tabella come reference:
http://it.wikipedia.org/wiki/UTF-8#Descrizione

da quanto sopra:
1 carattere : x & 0x80 == 0x00
2 caratteri : x & 0xe0 == 0xb0
3 caratteri : x & 0xf0 == 0xe0
4 caratteri : x & 0xf8 == 0xf0

E questo si sapeva, infatti se non l'avessi saputo non sarei riuscito ad implementare la lettura di caratteri unicode, il problema e' che quando li vai a stampare sul terminale alcuni caratteri hanno bisogno di 2 celle, altri di 1, e quello lo standard non lo dice perche e' appunto una questione di font e terminale, cosa che non c'entra niente con l'encoding di per se ma sarebbe compito delle ncurses.

@shura: Grazie :) Ora devo solo scoprire come usare wcwidth in Ruby lol.

Codice:
#! /usr/bin/env ruby
# encoding: utf-8
require 'dl/import'

module LibC
    extend DL::Importer

    dlload 'libc.so.6'
    extern 'int wcwidth (int)'
end

puts LibC.wcwidth('æ­»'.ord)

Bella merd*.
 
Stato
Discussione chiusa ad ulteriori risposte.