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
(забележете, че проверих само логиката, всъщност не я тествах, или че множество видове ansistrings са претоварени. 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[] в компилатора, но не и за други типове. Предпочитам да не използвам grep чрез източници на Embarcadero за евентуално свързани с FPC цели от причини за чисти помещения. Както и да е, благодаря. Причината за RTTI беше нова за мен. - person Marco van de Voort; 19.09.2010