powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как прибавить BOM-заголовок к строке AnsiString?
5 сообщений из 5, страница 1 из 1
Как прибавить BOM-заголовок к строке AnsiString?
    #39937230
crossa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть старая программа на Delphi 2009. В программе формируется строка типа AnsiString и записывается в файл. Возникла задача вставлять внутрь этой строки также данные в Юникоде. Хорошо, делаю так:
Код: pascal
1.
2.
3.
4.
5.
6.
var WStr : WideString;
   AStr : AnsiString;
   I : Integer;

for i := 1 to Length(WStr) do
   AStr := AStr + AnsiChar(Lo(Word(WStr[i]))) + AnsiChar(Hi(Word(WStr[i])));


Теперь возникла задача еще добавить два символа (BOM-заголовок) к этой строке.
Код: pascal
1.
AStr := #255 + #254 + AStr;


Проверил: работает, данные записываются в файл, в двоичном редакторе эти два символа отображаются как $FF и $FE.

Затем выполняю сборку программы, то есть в настройках проекта выбираю "Release" для "Build Configuration" и выполняю команду "Build" (Shift+F9) вместо "Compile". О, чудо! Теперь эти два символа записываются в файл как $79 и $3F (это коды символов "y" и "?").

То есть, символ #255 превратился в символ из таблицы Юникод с кодом 255, символ #254 - в символ с кодом 254. Затем, при вставке в AnsiString из-за русских региональных установок эти символы WideChar превратились в символы "y" и "?".

Я изменил код на этот:
Код: pascal
1.
AStr := AnsiChar(Byte(255)) + AnsiChar(Byte(254)) + AStr;


Был цейтнот, так что не было времени разбираться, в чем дело. Но теперь мне интересно: почему, когда "Build Configuration" был "Base", программа обрабатывала символы в кодировке ANSI одним образом, а для "Release" - другим способом? Что изменилось? Почему в одном случае программа обрабатывает эти символы как AnsiChar, в другом - как WideChar (и как это связано с вариантом компиляции программы, вот что непонятно)?

И другой вопрос: как правильно добавить два байта со значениями 255 и 254 ($FF $FE, BOM-загловок) в строку типа AnsiString? Использовать тип RawByteString? Явно указать, что это AnsiChar?
...
Рейтинг: 0 / 0
Как прибавить BOM-заголовок к строке AnsiString?
    #39937238
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crossa
В программе формируется строка типа AnsiString и записывается в файл
Почему бы сразу не использовать TStream?
crossa
почему, когда "Build Configuration" был "Base", программа обрабатывала символы в кодировке ANSI одним образом, а для "Release" - другим способом? Что изменилось?
Настройки проекта
crossa
Использовать тип RawByteString?
Да. Еще лучше TBytes
...
Рейтинг: 0 / 0
Как прибавить BOM-заголовок к строке AnsiString?
    #39937239
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crossa,

http://docwiki.embarcadero.com/RADStudio/Rio/en/HIGHCHARUNICODE_directive_(Delphi)

И обязательно посмотреть See Also.
...
Рейтинг: 0 / 0
Как прибавить BOM-заголовок к строке AnsiString?
    #39937325
crossa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, дело явно в HIGHCHARUNICODE: один из модулей проекта содержит директиву {$HIGHCHARUNICODE ON}. Поэтому символ #255 обрабатывается как WideChar. Спасибо за помощь.

Проект старый, над ним работали разные программисты. Изначально в заголовок файла записывался текст в кодировке ANSI, поэтому используется тип AnsiString. Сейчас появилась необходимость записывать текст в Юникод, поэтому разумнее применить другой тип для переменной. Спасибо за совет использовать TBytes.
...
Рейтинг: 0 / 0
Как прибавить BOM-заголовок к строке AnsiString?
    #39937748
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Явное приведение к AnsiChar - наглядно и надежно
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как прибавить BOM-заголовок к строке AnsiString?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]