我正在使用Unicode版本的NSIS来制作安装程序。我将为ANSI和Unicode文件添加行。在我给文件写一行之前,我需要知道文件是ANSI编码还是Unicode,所以我知道是否应该使用 FileWrite 或 FileWriteUTF16LE 。
如何查找文件的编码类型?
Unicode Plugin可以告诉我文件的编码不适用于 NSIS Unicode ,函数 unicode :: UnicodeType 总是返回6。
任何建议都会非常有用。
答案 0 :(得分: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
答案 1 :(得分: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,但最终确定编码为non trivial。一种方法是检查所有不同的BOM,如果文件没有BOM,则认为它不是unicode。