Так я и говорю, что это сделано плохо, т.е. ошибочно по самой философии. То есть первый косяк в том, что директива {$codepage} относится к любым строковым константам, хотя по смыслу должна была относится сугубо к обозначению кодовой страницы типа AnsiString и т.п. строк. К строкам типа UTF8, UTF16, UCS2 (UnicodeString, UTF8String) - такая директива не должна применяться.
Второй косяк в том, что BOM по какой-то странной логике носит тот же смысл что и директива {$codepage}.
Понятно, что если сегодня именно так, то то так. Вопрос - это на всегда, или это временно? Если временно - то можно подождать и не заморачиваться. Если это на всегда - то кроме Delphi ничего другое не применимо для работы с уникодом. По крайней мере мой опыт работы с дельфями говорит, что строковые типы там приводятся, как и любые другие типы, по типу получателя. Работая одновременно и с UnicodeString и AnsiString не возникает ни каких проблем, вне зависимости ни от формата файла (BOM), ни от чего-то другого. По крайней мере сообщения компилятора про преобразования строк разного типа не возникают в этом случае.