Calc macro : écrire des caractères coréens dans un fichier

Bonjour

Voici une nouvelle question envoyée à l'aide du formulaire de demande d'aide (http://fr.libreoffice.org/get-help/poser-une-question/).
Si vous répondez, merci de penser à utiliser la fonction "répondre à tous" de votre logiciel de courrier électronique de façon que le demandeur reçoive une copie de votre réponse.

Email:: cmapoubellemail@gmail.com
Sujet:: Calc macro : écrire des caractères coréens dans un fichier
OS:: Windows 10
Version:: 6.0.x
Question:: Bonjour,
J'utilise LibreOffice Calc pour gérer des traductions, ainsi qu'une macro qui génère des fichiers .json (un par langue, dont le coréen, seule langue avec alphabet non latin du lot).

Calc m'affiche bien les caractères coréens, mais dans le fichier .json généré, je n'ai que des "?". Comment régler le problème ?

Je n'ai pas d'autre problème que ça.

Merci,

Bonjour

Si vous répondez, merci de penser à utiliser la fonction "répondre à
tous" de votre logiciel de courrier électronique de façon que la liste
reçoive une copie de votre réponse.

Email:: cmapoubellemail@gmail.com
Sujet:: Calc macro : écrire des caractères coréens dans un fichier
OS:: Windows 10
Version:: 6.0.x
Question:: Bonjour,
J'utilise LibreOffice Calc pour gérer des traductions, ainsi qu'une macro qui génère des fichiers .json (un par langue, dont le coréen, seule langue avec alphabet non latin du lot).

Calc m'affiche bien les caractères coréens, mais dans le fichier .json généré, je n'ai que des "?". Comment régler le problème ?

Bonsoir,

quel est l'encodage du fichier json ? c'est la macro qui le défini ou le
système ?

Je n'ai pas d'autre problème que ça.

Merci,

Gérard

Bonjour,

Apparemment c'est en ANSI, je ne sais pas comment faire en sorte que la
macro fasse de l'UTF-8 (ou je ne sais pas quel autre format nécessaire au
coréen)

Bonjour,
comme dit par Gérard, c'est une question de codage, ton fichier json
devrait normalement par défaut codé en UTF-8. qu'utilises-tu pour lire le
fichier ?
Notepad++ devrait pour lire ça :wink:

Yves

Re,

indique-nous comment ta macro crée le fichier (le code source) et on pourra
surement t'indiquer comment faire :wink:

Yves

Bonjour,

[...]
Sujet:: Calc macro : écrire des caractères coréens dans un fichier
OS:: Windows 10
Version:: 6.0.x
Question:: Bonjour,
J'utilise LibreOffice Calc pour gérer des traductions, ainsi qu'une macro qui génère des fichiers .json (un par langue, dont le coréen, seule langue avec alphabet non latin du lot).

Calc m'affiche bien les caractères coréens, mais dans le fichier .json généré, je n'ai que des "?". Comment régler le problème ?

Un problème d'encodage peut-être.

Si vous répondez, merci de penser à utiliser la fonction "répondre à tous" de votre logiciel de courrier électronique de façon que la liste de discussion reçoive une copie de votre réponse.
ATTENTION : je ne réponds pas aux réponses qui sont envoyées seulement à moi. Nous sommes sur une liste d'entraide, pas un service après-vente.

Bonne journée
JBF

Oui je le lis avec Notepad++ et de base il n'est pas en UTF-8 mais ANSI, je
dois le convertir à la main sur Notepad++. Le problème c'est que le fichier
coréen est déjà rempli de "?", le mettre en UTF-8 ne change rien.

D'ailleurs quand je crée au préalable un fichier en UTF-8, la macro en
recrée un de zéro en ANSI au lieu d'écrire dans l'ancien en UTF-8.

Voici la macro :
Elle parse les lignes du document pour chaque langue, les langues étant des
colonnes (de la colonne E à J). Les 4 premières colonnes (A à D) servent à
la mise en forme et aux balises du code JSON.

Ah, au temps pour moi, je cliquais sur "reply" depuis le forum, je croyais
que tout le monde le voyais, le site me disant que le mail était envoyé à
toute la liste.

Je ne vois pas mon message où j'avais posté le code de la macro, donc je
recommence en utilisant la boite mail cette fois (je comprends rien à ce
système de mélange forum/mailing list, première fois que je vois ça désolé).

Comme je le disais précédemment, le fichier JSON créé par la macro est
apparemment ANSI, je ne sais pas lui dire de faire de l'UTF-8. Quand je
crée au préalable un fichier en UTF-8, la macro l'écrase pour en refaire un
en ANSI.
Convertir le fichier en UTF-8 après coup n'enlève pas les "?". J'ai essayé
plusieurs éditeurs de texte et plusieurs fontes.

Le copier/coller fait un peu buguer l'indentation.
Dans mon fichier Calc, de la colonne A à D, ce sont les balises et marques
pour le formatage du langage JSON.
De la colonne E à J ce sont les langues.
La macro parse les lignes et les écrit à la suite dans un fichier .json
propre à chaque langue en créant la bonne indentation et le bon formatage
du langage.

REM ***** BASIC *****

Sub Main

Dim oFeuille as object, Cellule as object
Dim Resultat as string

oFeuille = ThisComponent.Sheets.getByName("quiz")

Nblang=6

for Lang=0 to (Nblang-1)
if Lang=0 then Fichier= Left(ThisComponent.URL , Len(ThisComponent.URL)-16)
& "en.json"
if Lang=1 then Fichier= Left(ThisComponent.URL , Len(ThisComponent.URL)-16)
& "fr.json"
if Lang=2 then Fichier= Left(ThisComponent.URL , Len(ThisComponent.URL)-16)
& "de.json"
if Lang=3 then Fichier= Left(ThisComponent.URL , Len(ThisComponent.URL)-16)
& "es.json"
if Lang=4 then Fichier= Left(ThisComponent.URL , Len(ThisComponent.URL)-16)
& "it.json"
if Lang=5 then Fichier= Left(ThisComponent.URL , Len(ThisComponent.URL)-16)
& "kr.json"

open Fichier for output as #1
for l=1 to 350 ' lignes (parse l'intégralité du document)
Resultat=""
    for c=0 to 4
    Cellule = oFeuille.getCellByPosition(c,l)
    CelluleLang = oFeuille.getCellByPosition(c+Lang,l)
CelluleLangSuivante = oFeuille.getCellByPosition(c+Lang,l+1)
  if c=0 and len(Cellule.String)>0 then
  Resultat = Cellule.String
  goto quiznext
  endif
      if c<4 and len(Cellule.String)>1 then
      Resultat = Resultat & Cellule.String
      endif
      if c=4 and len(CelluleLang.String)>1 and
len(CelluleLangSuivante.String)>1 then Resultat = Resultat & " """ &
CelluleLang.String & ""","
      if c=4 and l<>54 and len(CelluleLang.String)>1 and
len(CelluleLangSuivante.String)=0 then Resultat = Resultat & " """ &
CelluleLang.String & """"
  if c=4 and l=54 then Resultat = Resultat & " """ & CelluleLang.String &
""","
      if len(Cellule.String)=0 then Resultat = Resultat & " "
   quiznext:
   next c
   if len(Resultat)>1 then
      print #1, Resultat
   endif
next l
close #1
next Lang

Bonjour,

La macro parse les lignes et les écrit à la suite dans un fichier .json
propre à chaque langue en créant la bonne indentation et le bon formatage
du langage.

le problème d'encodage vient de là :

open Fichier for output as #1

[...]

print #1, Resultat
close #1

Vous utilisez les primitives standard du LibO Basic pour écrire dans le fichier. De fait, vous n'avez pas accès à la méthode d'encodage des caractères.

Pour avoir la pleine maîtrise de cet aspect, je vous conseille d'utiliser l'API relative aux flux.

Dans ce cadre, vous ferez appel à deux services :
-- com.sun.star.ucb.SimpleFileAccess
qui fournit l'accès au fichier
-- com.sun.star.io.TextOutputStream
qui permet l'accès en écriture à un fichier texte (comme son nom l'indique)

Ce dernier service fournit une méthode setEncoding() qui vous permet de choisir l'encodage voulu. Les valeurs possibles figurent dans la page web https://www.iana.org/assignments/character-sets/character-sets.xhtml
(colonne Name)

-> Sachez cependant que UTF-8 est l'encodage par défaut proposé par TextOutputStream.

Par exemple, pour écrire un fichier texte encodé en UTF-8 via l'API flux en Basic, vous auriez un code comme celui-ci :

8< ----------------------------------------------------------------

Dim oSFA As Object
Dim oOutText As Object
Dim FichierURL As String

oSFA = createUNOService("com.sun.star.ucb.SimpleFileAccess")
FichierURL = ConvertToURL("C:\chemin\vers\MonFichier.txt")
oOutText = createUNOService("com.sun.star.io.TextOutputStream")
oOutText.setOutputStream(oSFA.openFileWrite(FichierURL))
'écrire (les délimiteurs de ligne doivent être spécifiés)
'[ici CRLF (Windows)]
oOutText.WriteString("Hello World" & Chr(13) & Chr(10))
oOutText.WriteString("Ligne 2" & Chr(13) & Chr(10))
'vider les tampons et fermer
oOutText.flush
oOutText.closeOutput()

--------------------------------------------------------------- >8

Bien cordialement,