NSIS版本信息UTF-8编码异常:如何实现©字符的正确UTF-16编码
解决NSIS UTF-8脚本中©字符编码问题
你遇到的问题是NSIS在处理UTF-8脚本里的非ASCII字符时,没有正确将UTF-8字节解码为Unicode字符,而是直接把每个UTF-8字节当作单字节转成了UTF-16,导致版权信息里出现了\xC2\xA9这样的错误序列。除了把整个脚本改成UTF-16编码外,还有两个简单的解决办法:
方法1:直接使用Unicode转义序列
NSIS支持在字符串中使用\uXXXX格式的Unicode转义序列(XXXX是字符的十六进制代码点)。©的Unicode代码点是U+00A9,所以你可以把版权行修改为:
VIAddVersionKey "LegalCopyright" "Me \u00A9 2022"
这样编译后,安装程序资源里的版权信息就会正确显示为Me © 2022。
方法2:定义常量复用字符
如果需要在脚本多处使用©字符,可以先定义一个常量,再在需要的地方引用:
!define COPYRIGHT_SYMBOL "\u00A9" VIAddVersionKey "LegalCopyright" "Me ${COPYRIGHT_SYMBOL} 2022"
这种方式让代码更易读,也方便后续维护。
原理说明
NSIS 3.x对UTF-8脚本的Version Info字段处理逻辑,是直接将UTF-8字节逐字节转换为UTF-16(相当于把每个UTF-8字节当作Latin-1字符),而不是先解码UTF-8得到Unicode字符再编码为UTF-16。使用\uXXXX转义序列可以直接告诉NSIS要生成的Unicode字符,绕过这个错误的转换过程。
内容的提问来源于stack exchange,提问作者rofo
相关产品推荐
相关产品推荐

