Добавьте пользовательский инструмент в цепочку инструментов для удаления спецификации UTF-8 перед компиляцией.

Мой вопрос в контексте Code::Blocks и его измененной версии MinGW и Notepad++.

Я хочу иметь возможность включать литералы Unicode в свой исходный код, и я могу, если я использую UTF-8 и не использую спецификацию.

Это работает нормально, до определенного момента, но BOM выходит (плохой каламбур) всякий раз, когда я снова открываю файл; он (что неудивительно) имеет неприятный побочный эффект отображения Unicode в форме ANSI. :(

Эти очень полезные и в то же время очень надоедливые три байта должны быть там, а потом они должны исчезнуть! (во время компиляции).

Это звучит достаточно просто, просто предварительно обработайте исходный файл(ы) и отбросьте первые три байта (если они являются спецификацией UTF-8)...

Я, конечно, не собираюсь быть процессором (путем удаления вручную) каждый раз, когда я компилирую, поэтому я даже прибегал к использованию файлов #include без BOM для этих литералов, но это проблематично с нескольких точек зрения, не в последнюю очередь из что это боль в поговорке, и я не могу "видеть" их! ..без большого жонглирования.

Есть ли способ подключиться к цепочке инструментов с помощью специального препроцессора? ... или если я пропустил какое-то очевидное решение, я был бы очень признателен, если бы услышал об этом.


person Peter.O    schedule 27.06.2010    source источник


Ответы (2)


В любом случае вы можете рассмотреть возможность переноса всех ваших строковых литералов в отдельный файл и использования функции loadLit() (или аналогичной) для их получения во время выполнения.

Это позволит вам иметь один файл (со спецификацией), содержащий все ваши строковые литералы, и значительно облегчит вашу жизнь, если вам когда-нибудь понадобится интернационализировать ваше приложение.

Мы делаем это с нашими программами, но имейте в виду, что наши программы класса 1 должны быть адаптированы для 21 различных языков, поэтому мы экономим много работы, делая это таким образом :-) Ваш пробег может отличаться.

person paxdiablo    schedule 04.08.2010

Я еще немного поковырялся и нашел предварительное решение. Я не совсем доволен этим, потому что это связано с изменением исходного кода, тогда как на самом деле я искал конвейерное решение, но кажется, что g++.exe принимает только аргументы командной строки (пожалуйста, поправьте меня, если я ошибаюсь).

Мое «решение» немного грубое, но оно работает и, безусловно, лучше (для меня), чем любое другое жизнеспособное решение, с которым я сталкивался (которого нет!). Оно требует должного внимания к вашему редактору. Окно сообщения «Файл был внешне изменен» (если файл редактируется), но на самом деле спецификация все еще находится в редакторе, так что это несколько спорный вопрос.

Это простой взлом командной строки. Я бы предпочел более интегрированный вариант, но вот этот (и он работает):

В Codeblocks перейдите в: Настройки -> Компилятор и отладчик -> Другие настройки -> [Дополнительные параметры] -> Макрос командной строки:

Сделайте эти моды в командной строке. Все они должны быть в одной строке (конечно), но для ясности я их разделил:

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 y/n arg для подпрограммы, которая # включает эти файлы, решит эту проблему довольно просто... (но это всего лишь Проблема с Windows... может быть, поэтому она не обслуживается... или была? Кто-нибудь знает?

person Peter.O    schedule 27.06.2010