2 votes

NSIS WriteINIStr Unicode

J'essaie de créer un programme d'installation NSIS pour une application que j'ai écrite.

Le programme d'installation prend un certain nombre de détails sur l'utilisateur et les écrit dans un fichier INI. Le problème que je rencontre actuellement est que le fichier INI créé est ASCII. Cela signifie que si un utilisateur saisit un élément Unicode ou provenant d'une langue non prise en charge, je reçois les messages suivants ???? dans le fichier ini.

En utilisant NSIS, comment puis-je écrire des fichiers INI Unicode ?

Mise à jour 1 : Ok, après avoir remarqué qu'il y a une nouvelle version de NSIS (v3.0a) qui a plus d'options pour Unicode, j'ai pensé que je pourrais l'installer pour voir si cela fonctionne.

Le code de l'application précédente est entièrement compatible et l'exe a été construit, mais, le problème demeure que le WriteINIStr n'écrit pas l'unicode.

2voto

Anders Points 34448

WriteINIStr appelle WritePrivateProfileString et bien que la version Unicode (WritePrivateProfileStringW) écrive également en ansi par défaut, elle écrira en UTF16LE si le fichier .ini comporte une nomenclature .

Vous pouvez donc utiliser les fonctions de base de NSIS File* pour voir s'il existe une nomenclature, sinon vous pouvez l'ajouter avant d'utiliser les commandes ini...

1voto

Seki Points 5620

Si vous utilisez la dernière version stable 2.46, NSIS ne prend pas en charge l'unicode et vous devez construire vous-même le fichier .ini via FileOpen / FileWrite / FileClose et la conversion du texte par le plugin du système.

Il y a une branche unicode tant attendue qui se prépare depuis 2009 et je n'ai pas remarqué qu'une v 3.0a0 vient de sortir et est disponible sur le site de téléchargement. (Avant cela, vous deviez vérifier le code et construire les binaires vous-même).

Vous devriez essayer de l'utiliser.

Editar : J'ai fait un petit script pour démontrer comment écrire un fichier texte UTF-16le "à la main" avec NSIS 2.46, vous pouvez essayer si votre chaîne de caractères avec des caractères "exotiques" de la zone de texte est correctement écrite dans le fichier de test.

!include LogicLib.nsh
Name "unicode246"
OutFile unicode246.exe
ShowInstDetails show

Section

    StrCpy $1 "héhé © reçu" ;some "exotic" french chars
    StrLen $2 $1

    System::Call "*(&w${NSIS_MAX_STRLEN} r1)i.s"    ;allocate a buffer and write in wide char
    Pop $0  ;get the buffer address

    FileOpen $9 $EXEDIR\test.txt w ;Opens a file for writing

    ;write UTF-16LE BOM
    FileWriteByte $9 "255"
    FileWriteByte $9 "254"

    ;compute the buffer byte size
    IntOp $2 $2 * 2
    IntOp $2 $2 - 1

    ;loop on the bytes
    ${forEach} $1 0 $2 + 1
        IntOp $3 $0 + $1    ;compute the address of the nth byte

        System::Call "*$3(&i1 .r4)" ;read the byte in $4
        DetailPrint "address $0 + $1 = $3 = $4"
        FileWriteByte $9 $4
    ${next}
    FileClose $9
    System::Free $0 ;free buffer
SectionEnd

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X