Преобразование OEM в Ansi с помощью D2009+

Для экспертов версии Unicode:

Можно ли определить тип ansistring, отражающий текущую кодировку OEM?

(при условии, что ansistring без идентификаторов кодовой страницы отражает кодовую страницу ansi)

Вопрос наполовину шуточный, наполовину серьезный:

Это значительно упростило бы мой перенос блока CRT на Unicode (сделав его красивым и типизированным).


person Marco van de Voort    schedule 17.09.2010    source источник


Ответы (1)


Кажется, вы должны иметь возможность использовать CP_OEMCP так же, как вы можете использовать CP_ACP для получения кодовой страницы Ansi.

type
  OemString = type AnsiString(CP_OEMCP);

Если это не сработает, объявите свою переменную как RawByteString. Заполните его необходимыми данными, и как только вы узнаете, какая текущая кодовая страница OEM (с помощью GetOEMCP), используйте SetCodePage, чтобы назначить эту кодовую страницу в строку (в этот момент она уже точно не будет RawByteString, несмотря на заявленный тип).

person Rob Kennedy    schedule 17.09.2010
comment
Я хочу объявить определенные процедуры, чтобы принимать только OEM. И автоконвертировать при необходимости. Первое решение подходит для этого и принимается, второе имеет меньший смысл (поскольку с шагами ручного преобразования я мог бы просто вызвать oemtoansi и обратно) - person Marco van de Voort; 17.09.2010
comment
(обратите внимание, я только проверял логику, я на самом деле не проверял ее, или что несколько видов строк перегрузки могут быть перегружены. TYPE x = type y не всегда работает для этого) - person Marco van de Voort; 17.09.2010
comment
Нужно ли вообще дополнительное ключевое слово type? Если вы можете перегрузить AnsiString по сравнению с Utf8String, то вы также сможете перегрузить на основе OemString. - person Rob Kennedy; 17.09.2010
comment
Я никогда не находил большого применения для шрифта. Кажется, это не помогает для перегрузки простых типов. Я даже не мог придумать кусок кода на Borland Pascals, где это имеет значение, я думаю. Но это, может быть, что-то для отдельного вопроса - person Marco van de Voort; 19.09.2010
comment
Вы должны использовать type при объявлении новых типов на основе AnsiString(N). - person Remy Lebeau; 19.09.2010
comment
Это имеет значение в декларации TDateTime, @Marco. В противном случае, например, Инспектор объектов заставит вас редактировать свойства этого типа как обычный Double вместо отображения средства выбора даты и времени. Аналогично для TColor. - person Rob Kennedy; 19.09.2010
comment
Значит, такой новый определенный тип предназначен только для RTTI, а не для перегрузки? У вас есть другие примеры? - person Marco van de Voort; 19.09.2010
comment
@Марко: grep -r '= type ' $(BDS)\Source\\*; Я не знаю, скольким из них действительно нужен новый тип. Я думал, что это только для RTTI, но если Реми говорит, что это требуется для специфичных для кодовой страницы типов AnsiString, то я поверю ему на слово; У меня нет достаточно новой версии Delphi, чтобы убедиться в этом. Возможно, компилятор использует RTTI для генерации правильного кода преобразования. - person Rob Kennedy; 19.09.2010
comment
ansistring особенный, поскольку для вставки автопреобразования типы должны быть разными. Но видимо это подготовлено для ansistring[] в компиляторе, но не для других типов. Я предпочитаю не просматривать исходники Embarcadero, возможно, для целей, связанных с FPC, из соображений чистой комнаты. В любом случае, спасибо. Причина RTTI была для меня новой. - person Marco van de Voort; 19.09.2010