OVH Cloud OVH Cloud

UTF-8 en C?

7 réponses
Avatar
Maxime Wojtczak
Bonjour,

Je developpe actuellement des CGIs en C. Or, ces CGIs sont destiné à un
site internet disponible en plusieurs langues. Je dois donc inclure une
traduction japonnaise et pour cela, j'ai besoin de l'UTF-8. Or, je ne
sais pas comment l'utiliser au sein de mon source en C. Je n'ai eu aucun
problème pour inclure les phrases en francais, anglais, etc (normal vous
me dirais...). Mais comment inclure des Kanjis (symboles japonnais) dans
un printf par exemple?

Je ne sais pas si je suis dans le bon news group pour cette question,
car ce doit être un problème indépendant du langage, mais je ne vois pas
vraiment où la poser ailleurs.

Merci d'avance.

Max

7 réponses

Avatar
DINH Viêt Hoà

Je developpe actuellement des CGIs en C. Or, ces CGIs sont destiné à un
site internet disponible en plusieurs langues. Je dois donc inclure une
traduction japonnaise et pour cela, j'ai besoin de l'UTF-8. Or, je ne
sais pas comment l'utiliser au sein de mon source en C. Je n'ai eu aucun
problème pour inclure les phrases en francais, anglais, etc (normal vous
me dirais...). Mais comment inclure des Kanjis (symboles japonnais) dans
un printf par exemple?


c'est pas tant le problème du printf(), cette fonction te crache telle
quelle ce que tu lui donnes.
En CGI, il faut que tu sortes de l'UTF-8 encapsulé dans une page HTML en
fait.

Je ne sais pas trop comment est codé l'UTF8 dans une page HTML mais en
tout cas iconv() (non standard C mais POSIX peut te servir.

--
DINH V. Hoa,

"monde de merde" -- Erwan David

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Maxime Wojtczak wrote:

Bonjour,

Je developpe actuellement des CGIs en C. Or, ces CGIs sont destiné à un
site internet disponible en plusieurs langues. Je dois donc inclure une
traduction japonnaise et pour cela, j'ai besoin de l'UTF-8. Or, je ne
sais pas comment l'utiliser au sein de mon source en C. Je n'ai eu aucun
problème pour inclure les phrases en francais, anglais, etc (normal vous
me dirais...). Mais comment inclure des Kanjis (symboles japonnais) dans
un printf par exemple?

Je ne sais pas si je suis dans le bon news group pour cette question,
car ce doit être un problème indépendant du langage, mais je ne vois pas
vraiment où la poser ailleurs.


Un caractère est une valeur entre 1 et 255. On peut écrire
"x1" à "xff" (héxadécimal), ou
"1" à "377" (octal)

Pour les caractères multiples, il suffit de juxtaposer des caractères
simples.

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Maxime Wojtczak
Oui, c'est une solution comme ca que je cherchais.
Mais j'ai trouvé une petite description de la norme UTF-8 qui m'a permis
de coder cette petite fonction:

void printkanji(int c)
{
int t1,t2,t3;

t1 = (char) c & 0x3F;
t1 = t1 | 0x80;

c = c >> 6;
t2 = (char) c & 0x3F;
t2 = t2 | 0x80;

c = c >> 6;
t3 = (char) c & 0x0F;
t3 = t3 | 0xE0;

putchar(t3);
putchar(t2);
putchar(t1);
}

qui affiche un kanji (ou plus généralement un caractère unicode) passé
en paramètre.

Merci à vous 2 pour vos réponses

Max



Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', Maxime Wojtczak wrote:


Bonjour,

Je developpe actuellement des CGIs en C. Or, ces CGIs sont destiné à un
site internet disponible en plusieurs langues. Je dois donc inclure une
traduction japonnaise et pour cela, j'ai besoin de l'UTF-8. Or, je ne
sais pas comment l'utiliser au sein de mon source en C. Je n'ai eu aucun
problème pour inclure les phrases en francais, anglais, etc (normal vous
me dirais...). Mais comment inclure des Kanjis (symboles japonnais) dans
un printf par exemple?

Je ne sais pas si je suis dans le bon news group pour cette question,
car ce doit être un problème indépendant du langage, mais je ne vois pas
vraiment où la poser ailleurs.



Un caractère est une valeur entre 1 et 255. On peut écrire
"x1" à "xff" (héxadécimal), ou
"1" à "377" (octal)

Pour les caractères multiples, il suffit de juxtaposer des caractères
simples.




Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Maxime Wojtczak wrote:

Oui, c'est une solution comme ca que je cherchais.
Mais j'ai trouvé une petite description de la norme UTF-8 qui m'a permis
de coder cette petite fonction:


Pour éviter les problèmes:

void printkanji(int c)


void printkanji(unsigned c)

{
int t1,t2,t3;


unsigned t1,t2,t3;

t1 = (char) c & 0x3F;


t1 = c & 0x3F;

t1 = t1 | 0x80;


t1 |= 0x80;

c = c >> 6;


c >>= 6;

t2 = (char) c & 0x3F;


t2 = c & 0x3F;

t2 = t2 | 0x80;


t2 |= 0x80;

c = c >> 6;


c >>= 6;

t3 = (char) c & 0x0F;


t3 = c & 0x0F;

t3 = t3 | 0xE0;


t3 |= 0xE0;

putchar(t3);
putchar(t2);
putchar(t1);
}


--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Jean-Marc Bourguet
Maxime Wojtczak writes:

Bonjour,

Je developpe actuellement des CGIs en C. Or, ces CGIs sont destiné à un
site internet disponible en plusieurs langues. Je dois donc inclure une
traduction japonnaise et pour cela, j'ai besoin de l'UTF-8. Or, je ne sais
pas comment l'utiliser au sein de mon source en C. Je n'ai eu aucun
problème pour inclure les phrases en francais, anglais, etc (normal vous me
dirais...). Mais comment inclure des Kanjis (symboles japonnais) dans un
printf par exemple?

Je ne sais pas si je suis dans le bon news group pour cette question, car
ce doit être un problème indépendant du langage, mais je ne vois pas
vraiment où la poser ailleurs.


Le plus simple, utiliser des wchar_t et une « locale » UTF-8.
Naturellement il faut du support du système. Avantage si tu dois
passer a JIS ou Shift JIS ou EUC, il « suffit » d'avoir la bonne «
locale ».

Plus compliqué: gérer tout soi-même et utiliser le fait que dans la
locale "C" on est sûr que les codes ne sont pas transformé. Il n'y a
pas besoin de l'aide du système mais on n'a fait le travail que pour
UTF-8.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Éric Lévénez
Le 25/04/04 18:02, dans ,
« Emmanuel Delahaye » a écrit :

In 'fr.comp.lang.c', Maxime Wojtczak wrote:

Oui, c'est une solution comme ca que je cherchais.
Mais j'ai trouvé une petite description de la norme UTF-8 qui m'a permis
de coder cette petite fonction:


Pour éviter les problèmes:

void printkanji(int c)


void printkanji(unsigned c)


Pour être encore plus générique, en Unicode 4 (l'encodage actuel de Mac OS X
par exemple), on a plus de 64000 caractères, et un unsigned int ne pourra
les contenir tous, il faut donc utiliser un unsigned long.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
Antoine Leca
En 408be310$0$21152$, Jean-Marc Bourguet va escriure:
Le plus simple, utiliser des wchar_t et une « locale » UTF-8.


Hmmm. Pas sûr que cela apporte quoique ce soit. Par contre, je vois bon
nombre de problèmes additionnels...

Naturellement il faut du support du système.


Pas exemple. En l'occurence, un compilateur qui "sait" lire l'encodage des
chaînes que tu lui donnes.

Avec des char normaux, ce n'est pas nécessaire (comme on l'a répét´t à
l'envie avec Vincent la semaine dernière, c'est possible; mais dans la
pratique, cela passe comme une lettre à la poste, sans modification).


Avantage si tu dois passer a JIS ou Shift JIS ou EUC, il « suffit »
d'avoir la bonne « locale ».


???
".utf8" est une locale exactement au même plan que ".jis" ou ".euc-jp"; et
pour avoir deux en même temps, c'est coton...
En fait, c'est même pire que cela: avec pas mal de système, dont Solaris et
ceux qui respectent le standard WPI=XPG4 (1991, avant Unicode), dans une
locale genre ".euc-xx", les wchar_t ne sont pas encodés en Unicode, mais
dans un encodage particulier (une forme développée de EUC, un peu comme
UTF-32 par rapport à ".utf8"); le résultat... c'est que les fichiers en
wchar_t ne sont plus portables :-(. D'où => iconv().

Mais il n'y a pas besoin d'aller chercher des wchar_t pour devoir s'en
remettre à iconv(), cela marche très bien avec les char normaux.



Antoine