0

我正在使用 NSIS 的 Unicode 版本来制作安装程序。我将在 ANSI 和 Unicode 文件中添加行。在向文件写入一行之前,我需要知道文件是 ANSI 编码还是 Unicode,所以我知道我应该使用FileWrite还是FileWriteUTF16LE

如何找出文件的编码类型?

可以告诉我文件编码的Unicode 插件不适用于NSIS Unicode,函数unicode::UnicodeType总是返回 6。

任何建议都会非常有帮助。

4

2 回答 2

0

如果您想继续使用该插件,您可以自己将其重新编译为 unicode 或尝试CallAnsiPlugin 插件

您也可以自己执行检查:

!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
于 2012-09-15T21:05:44.233 回答
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。您可以轻松地修改此宏以检查其他 BOM,但是,明确确定编码并非易事。一种方法是检查所有不同的 BOM,如果文件没有 BOM,则假定它不是 unicode。

于 2015-02-26T20:43:11.370 回答