2

私が書いたアプリケーション用の NSIS インストーラーを構築しようとしています。

インストーラーは、多数のユーザーの詳細を取得し、これらを INI ファイルに書き込みます。私が現在抱えている問題は、作成された INI ファイルが ASCII であることです。これは、ユーザーが Unicode またはサポートされていない言語から何かを入力すると????、ini ファイル内で取得されることを意味します。

NSIS を使用して Unicode INI ファイルを作成するにはどうすればよいですか?

更新 1: わかりました。Unicode のオプションが追加された新しいバージョンの NSIS (v3.0a) があることに気づき、これをインストールして動作するかどうかを確認しようと思いました。

以前のアプリケーション コードは完全に互換性があり、exe がビルドされましたが、WriteINIStr が Unicode を書き込まないという問題がまだ残っています。

4

2 に答える 2

2

WriteINIStrWritePrivateProfileString を呼び出し、Unicode バージョン (WritePrivateProfileStringW) もデフォルトで ansi として書き込みますが、.ini ファイルに BOM がある場合はUTF16LE として書き込みます。

したがって、基本的な NSIS ファイル* 関数を使用して、BOM があるかどうかを確認できます。ない場合は、ini コマンドを使用する前に追加できます...

于 2013-07-03T20:56:21.723 に答える
1

最新の安定リリース 2.46 を使用している場合、NSIS は Unicode をサポートしていないため、FileOpen/ FileWrite/を介して自分で .ini ファイルを作成FileCloseし、システム プラグインを介してテキストを変換する必要があります。

待望の Unicode ブランチが 2009 年から開発されていますが、v 3.0a0がリリースされたばかりで、ダウンロード サイトで入手できることに気づきませんでした。(それまでは、コードをチェックアウトして自分でバイナリをビルドする必要がありました)。

あなたはそれを試してみるべきです。

編集: NSIS 2.46 を使用して UTF-16le テキスト ファイルを「手動で」書き込む方法を示す小さなスクリプトを作成しました。

!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
于 2013-07-03T10:35:00.737 に答える