2012-09-15 32 views
0

我使用Unicode版本的NSIS來製作安裝程序。我會將行添加到ANSI和Unicode文件。在我寫一行文件之前,我需要知道該文件是ANSI編碼還是Unicode,所以我知道是否應該使用FileWriteFileWriteUTF16LE確定文件編碼:Unicode或ANSI

如何找出文件的編碼類型?

Unicode Plugin能告訴我一個文件的編碼NSIS的Unicode,功能的Unicode :: UnicodeType不起作用總是返回6.

任何意見將是非常有益的。

回答

0

如果您想繼續使用該插件,您可以自己重新編譯爲unicode或嘗試CallAnsiPlugin plugin

您還可以進行自我檢查:

!include LogicLib.nsh 

!define ByHandleIsFileUTF16LE "'' ByHandleIsFileUTF16LE " 
!macro _ByHandleIsFileUTF16LE a b t f 
!insertmacro _LOGICLIB_TEMP 
FileReadByte ${b} $_LOGICLIB_TEMP 
IntCmpU $_LOGICLIB_TEMP 0xFF "" `${f}` 
FileReadByte ${b} $_LOGICLIB_TEMP 
IntCmpU $_LOGICLIB_TEMP 0xFE `${t}` `${f}` 
!macroend 
!define IsFileUTF16LE "'' IsFileUTF16LE " 
!macro _IsFileUTF16LE a b t f 
!insertmacro _LOGICLIB_TEMP 
Push $0 
FileOpen $0 "${b}" r 
!define _IsFileUTF16LE _IsFileUTF16LE${__LINE__} 
!insertmacro _ByHandleIsFileUTF16LE '' $0 ${_IsFileUTF16LE}t ${_IsFileUTF16LE}f 
${_IsFileUTF16LE}f: 
    StrCpy $_LOGICLIB_TEMP "" 
${_IsFileUTF16LE}t: 
!undef _IsFileUTF16LE 
FileClose $0 
Pop $0 
StrCmp "" $_LOGICLIB_TEMP `${f}` `${t}` 
!macroend 



section 

!macro testutf16detection file 
${If} ${IsFileUTF16LE} "${file}" 
    DetailPrint "${file} is UTF16LE" 
${Else} 
    DetailPrint "${file} is NOT UTF16LE" 
${EndIf} 
!macroend 

!insertmacro testutf16detection "$temp\test1.txt" 
!insertmacro testutf16detection "$temp\test2.txt" 

sectionend 
0

一個潛在的解決方案是,以檢查BOM。下面是如果一個文件使用utf16le應按編碼你可以如何檢查:

!define fileIsUTF16LE "!insertmacro FileIsUTF16LE" 
!macro FileIsUTF16LE file result 
    Push $0 
    Push $1 
    FileOpen $0 "${file}" r 
    FileReadByte $0 $1 
    IntCmpU $1 0xFF "" FileIsUTF16LE_ItsNot FileIsUTF16LE_ItsNot 
    FileReadByte $0 $1 
    IntCmpU $1 0xFE FileIsUTF16LE_ItIs FileIsUTF16LE_ItsNot FileIsUTF16LE_ItsNot 
    FileIsUTF16LE_ItIs: 
    StrCpy ${result} 1 
    Goto FileIsUTF16LE_Done 
    FileIsUTF16LE_ItsNot: 
    StrCpy ${result} 0 
    FileIsUTF16LE_Done: 
    FileClose $0 
    Pop $1 
    Pop $0 
!macroend 

用法:

${fileIsUTF16LE} "$R0" $3 
${If} $3 == 1 

注意,這將在所有情況下,因爲不是所有的UTF編碼需要一個BOM不能正常工作。您可以輕鬆修改此宏以檢查other BOM s,但是,確定地確定編碼是non trivial。一種方法是檢查所有不同的BOM,如果該文件沒有BOM,則假定它不是unicode。