将自定义工具添加到工具链以在编译之前删除UTF-8 BOM

时间:2010-06-27 11:11:48

标签: c++ unicode preprocessor byte-order-mark toolchain

我的问题是在Code :: Blocks及其MinGW和Notepad ++的调整版本的上下文中。

我希望能够在我的源代码中包含Unicode文字,我可以,只要我使用UTF-8而不使用BOM。

这种方法很好,直到某一点,但每当我重新打开文件时,它就会出现问题(坏双关语);它(毫不奇怪)具有以ANSI形式显示Unicode的这种令人不安的副作用。 :(

那些非常有用且非常烦人的三个字节必须在那里,然后他们必须去! (在编译时)。

听起来很简单,只需预处理源文件,然后丢弃前三个字节(如果它们是UTF-8 BOM)......

每次编译时,我肯定不会成为处理器(通过手动删除),因此我甚至使用无BOM的#include文件来处理这些文字,但是从几个角度来看这是有问题的,而不是其中最重要的是,这是众所周知的痛苦,我无法“看到”它们! ..没有太多的杂耍。

有什么方法可以使用自定义预处理器进入工具链吗? ......或者如果我错过了一些明显的解决方案,我非常感谢您的回忆。

2 个答案:

答案 0 :(得分:1)

您可能需要考虑将所有字符串文字外部化为单独的文件,并使用loadLit()函数(或类似函数)在运行时获取它们。

这将允许您拥有一个包含所有字符串文字的单个文件(带有BOM),如果您需要将应用程序国际化,将使您的生活更轻松。

我们用我们的东西做到这一点,但请记住,我们的1级课程必须在21种不同的地方进行i18n'ed所以我们通过这种方式节省了大量的工作:-)你的里程可能会有所不同。

答案 1 :(得分:0)

我已经化了许多,我已经找到了一个试验性的解决方案。我对它并不完全满意,因为它涉及修改源代码,而我实际上是在寻找一个管道解决方案,但似乎g ++。exe只接受命令行参数(如果我错了,请纠正我)。

我的“解决方案”有点粗糙,但它确实有效,对我来说肯定比我遇到的任何其他可行的解决方案更好(没有!)需要给予应有的关注在你的编辑器的“文件已被外部修改”消息框(如果正在编辑文件),但事实上,BOM仍然在编辑器中,所以这有点没有实际意义。

这是一个简单的命令行破解。我更喜欢更集成的选项,但这是一个(它可以工作):

在Codeblocks中,转到:设置 - >编译器和调试器 - >其他设置 - >    [高级选项] - >命令行宏:

将这些mod设置为命令行。 它们应该都在一条线上(当然),但为了清楚起见,我把它们分开了:

cmd /c DropTheBOM.exe $file
& $compiler $options $includes -c $file -o $object // (use your compiler cmdline)
& MakeTheBOM.exe $file
// Write your own utils, or try here: http://code.google.com/p/utf-bom-utils/

PS:#include文件没有剥离他们的BOM(如果有的话)。      一个简单的BOM y / n arg开关用于#includes这些文件的例程可以很简单地解决这个问题...(但它只是一个Windows问题...也许这就是为什么它没有被照顾...或者有吗?有人知道吗?