NSIS WriteINIStr Unicode

ฉันกำลังพยายามสร้างตัวติดตั้ง NSIS สำหรับแอปพลิเคชันที่ฉันเขียน

โปรแกรมติดตั้งนำรายละเอียดผู้ใช้จำนวนหนึ่งมาเขียนลงในไฟล์ INI ปัญหาที่ฉันพบอยู่ในขณะนี้คือไฟล์ INI ที่สร้างเป็น ASCII ซึ่งหมายความว่าหากผู้ใช้ป้อน Unicode หรือจากภาษาที่ไม่รองรับ ฉันจะได้รับ ???? ภายในไฟล์ ini

การใช้ NSIS ฉันจะเขียนไฟล์ Unicode INI ได้อย่างไร

อัปเดต 1:เอาล่ะ เมื่อสังเกตเห็นว่ามี NSIS เวอร์ชันใหม่ (v3.0a) ซึ่งมีตัวเลือกเพิ่มเติมสำหรับ Unicode ฉันคิดว่าฉันจะติดตั้งสิ่งนี้เพื่อดูว่าใช้งานได้หรือไม่

รหัสแอปพลิเคชันก่อนหน้านี้เข้ากันได้อย่างสมบูรณ์และมี exe ถูกสร้างขึ้น แต่ปัญหายังคงอยู่ที่ WriteINIStr ไม่ได้เขียน Unicode


person Matt Seymour    schedule 03.07.2013    source แหล่งที่มา


คำตอบ (2)


หากคุณใช้เวอร์ชันเสถียรล่าสุด 2.46 NSIS ไม่รองรับ Unicode และคุณควรสร้างไฟล์ .ini ด้วยตัวเองผ่าน FileOpen / FileWrite / FileClose และแปลงข้อความผ่านปลั๊กอินของระบบ

มีสาขา Unicode ที่รอคอยมานานซึ่งกำลังผลิตมาตั้งแต่ปี 2009 และฉันไม่ได้สังเกตเห็นว่า v 3.0a0 เพิ่งเปิดตัวและมีให้บริการบนเว็บไซต์ดาวน์โหลด (จนกว่าคุณจะต้องตรวจสอบโค้ดและสร้างไบนารีด้วยตัวเอง)

คุณควรลองดูด้วย

แก้ไข: ฉันได้สร้างสคริปต์เล็กน้อยเพื่อสาธิตวิธีการเขียนไฟล์ข้อความ UTF-16le "ด้วยมือ" ด้วย NSIS 2.46 คุณสามารถลองถ้าสตริงของคุณที่มีอักขระ "แปลกใหม่" จากกล่องข้อความเป็น เขียนลงในไฟล์ทดสอบอย่างถูกต้อง

!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
person Seki    schedule 03.07.2013
comment
ฉันเพิ่งลองใช้สาขา Unicode แต่พบว่า WriteINIStr ยังคงทำเฉพาะ ASCII เท่านั้น (น่ารำคาญแค่ไหน) ฉันจะลองทำตามคำแนะนำของคุณในไม่ช้า - person Matt Seymour; 03.07.2013
comment
คุณเปิดใช้งาน Unicode อย่างชัดเจนหรือไม่ หาก 3.0 อัลฟ่าใช้ไม่ได้สำหรับคุณ ก็ยังมี unicode fork 2.46 ของ nsis อีกด้วย - person idleberg; 03.07.2013
comment
ฉันสร้างต้นแบบเพื่อสร้างไฟล์ utf16-le จาก nsis 2.46 หวังว่ามันจะช่วยได้ - person Seki; 03.07.2013
comment
ขอบคุณ @seki ฉันจะแจ้งให้คุณทราบว่าฉันเข้ากันได้อย่างไร - person Matt Seymour; 03.07.2013
comment
@idleberg ฉันดูที่ Unicode fork แต่ WriteINIStr ยังคงเป็น ascii เท่านั้น - person Matt Seymour; 03.07.2013
comment
@MattWritesCode: btw คุณลองหรือยังถ้าคุณเขียนไฟล์ .ini ด้วยอักขระ Unicode ด้วยตัวคุณเอง (เช่นด้วย Scintilla / UltraEdit / อะไรก็ตาม) ถ้ามันทำงานตามที่คาดไว้โดยโปรแกรมที่อ่านไฟล์ .ini - person Seki; 03.07.2013

WriteINIStr เรียก WritePrivateProfileString และในขณะที่เวอร์ชัน Unicode (WritePrivateProfileStringW) เขียนเป็น ansi ตามค่าเริ่มต้น แต่จะเขียนเป็น UTF16LE หากไฟล์ .ini มี BOM

ดังนั้น คุณสามารถใช้ฟังก์ชัน NSIS File* พื้นฐานเพื่อดูว่ามี BOM หรือไม่ หากไม่มี คุณสามารถเพิ่มได้ก่อนใช้คำสั่ง ini...

person Anders    schedule 03.07.2013