在执行包含非 ASCII 字符字符串常量的程序时,存在一些常见的陷阱和误区。以下几种存储源文件的方法会产生不同的影响:
- 以本地 8 位编码存储源文件
只能存储本地字符。编译器创建的字符串常量也采用本地 8 位编码,即执行字符集为本地 8 位。如果将本地 8 位编码的字符串传递给 HALCON C 或 HALCON/C++,要么更改接口默认编码(分别调用 SetHcInterfaceStringEncodingIsUtf8(false) 或 SetHcppInterfaceStringEncodingIsUtf8(false)),要么使用合适的转换函数(如 HString::FromLocal8Bit())创建传递给 HALCON 的字符串。如果使用 HALCON/C++ 作为替代方案,字符串常量可以创建为带有 "L... "的宽字符串。
- 以 UTF-8 格式存储源文件,带或不带 BOM 签名
其最大优点是可以存储任何 Unicode 字符。要在 Visual Studio 中存储无 BOM 签名的文件,请在 另存为 或 高级保存选项 对话框中选择 Unicode (UTF-8 without
signature) - Codepage 65001。没有 BOM 签名的文件不会被自动检测为 UTF-8 文件,即会被解释为本地 8 位文件。带有 BOM 签名标记的文件会被正确读取为 UTF-8 文件。但是,编译器会自动将字符串常量转换为本地 8 位编码,也就是说,虽然源字符集是 UTF-8,但执行字符集仍然是本地 8 位。因此,在将这些字符串传递给 HALCON 时,上述各点均有效。使用 Visual Studio 2015 时,可以设置编译器选项 /utf-8。可以在 项目属性页 > 配置属性 > C/C++ > 所有选项 > 附加选项 中添加该选项。如果设置了该选项,源代码字符集和执行字符集均为 UTF-8(在没有 BOM 签名的情况下也有效)。在这种情况下,所有字符串都是 UTF-8,可以直接传递给 HALCON。