|
|
|
Как прибавить BOM-заголовок к строке AnsiString?
|
|||
|---|---|---|---|
|
#18+
Есть старая программа на Delphi 2009. В программе формируется строка типа AnsiString и записывается в файл. Возникла задача вставлять внутрь этой строки также данные в Юникоде. Хорошо, делаю так: Код: pascal 1. 2. 3. 4. 5. 6. Теперь возникла задача еще добавить два символа (BOM-заголовок) к этой строке. Код: pascal 1. Проверил: работает, данные записываются в файл, в двоичном редакторе эти два символа отображаются как $FF и $FE. Затем выполняю сборку программы, то есть в настройках проекта выбираю "Release" для "Build Configuration" и выполняю команду "Build" (Shift+F9) вместо "Compile". О, чудо! Теперь эти два символа записываются в файл как $79 и $3F (это коды символов "y" и "?"). То есть, символ #255 превратился в символ из таблицы Юникод с кодом 255, символ #254 - в символ с кодом 254. Затем, при вставке в AnsiString из-за русских региональных установок эти символы WideChar превратились в символы "y" и "?". Я изменил код на этот: Код: pascal 1. Был цейтнот, так что не было времени разбираться, в чем дело. Но теперь мне интересно: почему, когда "Build Configuration" был "Base", программа обрабатывала символы в кодировке ANSI одним образом, а для "Release" - другим способом? Что изменилось? Почему в одном случае программа обрабатывает эти символы как AnsiChar, в другом - как WideChar (и как это связано с вариантом компиляции программы, вот что непонятно)? И другой вопрос: как правильно добавить два байта со значениями 255 и 254 ($FF $FE, BOM-загловок) в строку типа AnsiString? Использовать тип RawByteString? Явно указать, что это AnsiChar? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2020, 17:32 |
|
||
|
Как прибавить BOM-заголовок к строке AnsiString?
|
|||
|---|---|---|---|
|
#18+
crossa В программе формируется строка типа AnsiString и записывается в файл crossa почему, когда "Build Configuration" был "Base", программа обрабатывала символы в кодировке ANSI одним образом, а для "Release" - другим способом? Что изменилось? crossa Использовать тип RawByteString? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2020, 17:46 |
|
||
|
Как прибавить BOM-заголовок к строке AnsiString?
|
|||
|---|---|---|---|
|
#18+
crossa, http://docwiki.embarcadero.com/RADStudio/Rio/en/HIGHCHARUNICODE_directive_(Delphi) И обязательно посмотреть See Also. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2020, 17:48 |
|
||
|
Как прибавить BOM-заголовок к строке AnsiString?
|
|||
|---|---|---|---|
|
#18+
Да, дело явно в HIGHCHARUNICODE: один из модулей проекта содержит директиву {$HIGHCHARUNICODE ON}. Поэтому символ #255 обрабатывается как WideChar. Спасибо за помощь. Проект старый, над ним работали разные программисты. Изначально в заголовок файла записывался текст в кодировке ANSI, поэтому используется тип AnsiString. Сейчас появилась необходимость записывать текст в Юникод, поэтому разумнее применить другой тип для переменной. Спасибо за совет использовать TBytes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2020, 22:51 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39937325&tid=2038485]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 325ms |

| 0 / 0 |
