【问题标题】:Determine File Encoding: Unicode or ANSI确定文件编码:Unicode 或 ANSI
【发布时间】:2012-09-15 10:37:10
【问题描述】:

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

如何知道文件的编码类型?

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

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

【问题讨论】:

    标签: unicode encoding installation nsis


    【解决方案1】:

    如果您想继续使用该插件,您可以自己将其重新编译为 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
    

    【讨论】:

      【解决方案2】:

      一种可能的解决方案是检查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 BOMs,但是,最终确定编码是non trivial。一种方法是检查所有不同的 BOM,如果文件没有 BOM,则假定它不是 unicode。

      【讨论】:

        猜你喜欢
        • 2016-12-22
        • 2017-05-10
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        相关资源
        最近更新 更多