Добавьте пользовательский инструмент в цепочку инструментов для удаления спецификации UTF-8 перед компиляцией - PullRequest
1 голос
/ 27 июня 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 04 августа 2010

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

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

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

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

...