CodePage ID for CodePage name: equivalent to GetEncoding in Delphi?

I am looking for the Win32 equivalent of the .Net Encoding.GetEncoding method that will be used in Delphi7.

What I would like to achieve is to convert the Codepage ID (e.g.: 28592) to the name Codepage (iso-8859-2 in this case).

I found a Win32 function called GetCPInfoEx, but it returns a long CodePage name, and I need a short one, for example, the one listed on this page: (see Name column) http://msdn.microsoft.com/en-us/library /system.text.encoding.aspx

Thanks!

+4
source share
6 answers

Here is my code lookup table, feel free to use it.

type TCPData = record CPID: Integer; CPName: String; end; const MaxEncodings = 140; Encodings: Array[0..MaxEncodings - 1] of TCPData = ( (CPID: 37; CPName: 'IBM037'), (CPID: 437; CPName: 'IBM437'), (CPID: 500; CPName: 'IBM500'), (CPID: 708; CPName: 'ASMO-708'), (CPID: 720; CPName: 'DOS-720'), (CPID: 737; CPName: 'ibm737'), (CPID: 775; CPName: 'ibm775'), (CPID: 850; CPName: 'ibm850'), (CPID: 852; CPName: 'ibm852'), (CPID: 855; CPName: 'IBM855'), (CPID: 857; CPName: 'ibm857'), (CPID: 858; CPName: 'IBM00858'), (CPID: 860; CPName: 'IBM860'), (CPID: 861; CPName: 'ibm861'), (CPID: 862; CPName: 'DOS-862'), (CPID: 863; CPName: 'IBM863'), (CPID: 864; CPName: 'IBM864'), (CPID: 865; CPName: 'IBM865'), (CPID: 866; CPName: 'cp866'), (CPID: 869; CPName: 'ibm869'), (CPID: 870; CPName: 'IBM870'), (CPID: 874; CPName: 'windows-874'), (CPID: 875; CPName: 'cp875'), (CPID: 932; CPName: 'shift_jis'), (CPID: 936; CPName: 'gb2312'), (CPID: 949; CPName: 'ks_c_5601-1987'), (CPID: 950; CPName: 'big5'), (CPID: 1026; CPName: 'IBM1026'), (CPID: 1047; CPName: 'IBM01047'), (CPID: 1140; CPName: 'IBM01140'), (CPID: 1141; CPName: 'IBM01141'), (CPID: 1142; CPName: 'IBM01142'), (CPID: 1143; CPName: 'IBM01143'), (CPID: 1144; CPName: 'IBM01144'), (CPID: 1145; CPName: 'IBM01145'), (CPID: 1146; CPName: 'IBM01146'), (CPID: 1147; CPName: 'IBM01147'), (CPID: 1148; CPName: 'IBM01148'), (CPID: 1149; CPName: 'IBM01149'), (CPID: 1200; CPName: 'utf-16'), (CPID: 1201; CPName: 'unicodeFFFE'), (CPID: 1250; CPName: 'windows-1250'), (CPID: 1251; CPName: 'windows-1251'), (CPID: 1252; CPName: 'Windows-1252'), (CPID: 1253; CPName: 'windows-1253'), (CPID: 1254; CPName: 'windows-1254'), (CPID: 1255; CPName: 'windows-1255'), (CPID: 1256; CPName: 'windows-1256'), (CPID: 1257; CPName: 'windows-1257'), (CPID: 1258; CPName: 'windows-1258'), (CPID: 1361; CPName: 'Johab'), (CPID: 10000; CPName: 'macintosh'), (CPID: 10001; CPName: 'x-mac-japanese'), (CPID: 10002; CPName: 'x-mac-chinesetrad'), (CPID: 10003; CPName: 'x-mac-korean'), (CPID: 10004; CPName: 'x-mac-arabic'), (CPID: 10005; CPName: 'x-mac-hebrew'), (CPID: 10006; CPName: 'x-mac-greek'), (CPID: 10007; CPName: 'x-mac-cyrillic'), (CPID: 10008; CPName: 'x-mac-chinesesimp'), (CPID: 10010; CPName: 'x-mac-romanian'), (CPID: 10017; CPName: 'x-mac-ukrainian'), (CPID: 10021; CPName: 'x-mac-thai'), (CPID: 10029; CPName: 'x-mac-ce'), (CPID: 10079; CPName: 'x-mac-icelandic'), (CPID: 10081; CPName: 'x-mac-turkish'), (CPID: 10082; CPName: 'x-mac-croatian'), (CPID: 12000; CPName: 'utf-32'), (CPID: 12001; CPName: 'utf-32BE'), (CPID: 20000; CPName: 'x-Chinese-CNS'), (CPID: 20001; CPName: 'x-cp20001'), (CPID: 20002; CPName: 'x-Chinese-Eten'), (CPID: 20003; CPName: 'x-cp20003'), (CPID: 20004; CPName: 'x-cp20004'), (CPID: 20005; CPName: 'x-cp20005'), (CPID: 20105; CPName: 'x-IA5'), (CPID: 20106; CPName: 'x-IA5-German'), (CPID: 20107; CPName: 'x-IA5-Swedish'), (CPID: 20108; CPName: 'x-IA5-Norwegian'), (CPID: 20127; CPName: 'us-ascii'), (CPID: 20261; CPName: 'x-cp20261'), (CPID: 20269; CPName: 'x-cp20269'), (CPID: 20273; CPName: 'IBM273'), (CPID: 20277; CPName: 'IBM277'), (CPID: 20278; CPName: 'IBM278'), (CPID: 20280; CPName: 'IBM280'), (CPID: 20284; CPName: 'IBM284'), (CPID: 20285; CPName: 'IBM285'), (CPID: 20290; CPName: 'IBM290'), (CPID: 20297; CPName: 'IBM297'), (CPID: 20420; CPName: 'IBM420'), (CPID: 20423; CPName: 'IBM423'), (CPID: 20424; CPName: 'IBM424'), (CPID: 20833; CPName: 'x-EBCDIC-KoreanExtended'), (CPID: 20838; CPName: 'IBM-Thai'), (CPID: 20866; CPName: 'koi8-r'), (CPID: 20871; CPName: 'IBM871'), (CPID: 20880; CPName: 'IBM880'), (CPID: 20905; CPName: 'IBM905'), (CPID: 20924; CPName: 'IBM00924'), (CPID: 20932; CPName: 'EUC-JP'), (CPID: 20936; CPName: 'x-cp20936'), (CPID: 20949; CPName: 'x-cp20949'), (CPID: 21025; CPName: 'cp1025'), (CPID: 21866; CPName: 'koi8-u'), (CPID: 28591; CPName: 'iso-8859-1'), (CPID: 28592; CPName: 'iso-8859-2'), (CPID: 28593; CPName: 'iso-8859-3'), (CPID: 28594; CPName: 'iso-8859-4'), (CPID: 28595; CPName: 'iso-8859-5'), (CPID: 28596; CPName: 'iso-8859-6'), (CPID: 28597; CPName: 'iso-8859-7'), (CPID: 28598; CPName: 'iso-8859-8'), (CPID: 28599; CPName: 'iso-8859-9'), (CPID: 28603; CPName: 'iso-8859-13'), (CPID: 28605; CPName: 'iso-8859-15'), (CPID: 29001; CPName: 'x-Europa'), (CPID: 38598; CPName: 'iso-8859-8-i'), (CPID: 50220; CPName: 'iso-2022-jp'), (CPID: 50221; CPName: 'csISO2022JP'), (CPID: 50222; CPName: 'iso-2022-jp'), (CPID: 50225; CPName: 'iso-2022-kr'), (CPID: 50227; CPName: 'x-cp50227'), (CPID: 51932; CPName: 'euc-jp'), (CPID: 51936; CPName: 'EUC-CN'), (CPID: 51949; CPName: 'euc-kr'), (CPID: 52936; CPName: 'hz-gb-2312'), (CPID: 54936; CPName: 'GB18030'), (CPID: 57002; CPName: 'x-iscii-de'), (CPID: 57003; CPName: 'x-iscii-be'), (CPID: 57004; CPName: 'x-iscii-ta'), (CPID: 57005; CPName: 'x-iscii-te'), (CPID: 57006; CPName: 'x-iscii-as'), (CPID: 57007; CPName: 'x-iscii-or'), (CPID: 57008; CPName: 'x-iscii-ka'), (CPID: 57009; CPName: 'x-iscii-ma'), (CPID: 57010; CPName: 'x-iscii-gu'), (CPID: 57011; CPName: 'x-iscii-pa'), (CPID: 65000; CPName: 'utf-7'), (CPID: 65001; CPName: 'utf-8') ); implementation function GetEncoding(CPID: Integer): String; var I: Integer; begin Result := 'iso-8859-2'; //put the default encoding here for I := 0 to MaxEncodings - 1 do if Encodings[I].CPID = CPID then begin Result := Encodings[I].CPName; break; end; end; 

Thanks to everyone for the answers, but this turned out to be the only useful solution in this case ...

+6
source

Are you looking for official IANA names ? Since you want them to match the identifiers of Windows CP, I don’t think you can do better than this table .

+2
source

You need to use IMultiLanguage :: GetCodePageInfo exported as part of the MLang.dll file. It is included in IE4 and higher. You can create your import library yourself using the Delphi Import Component ... command or grab the low-level utilities from Colin Wilson's MultiLanguage_TLB.pas .

 function CodePageToCharSet(ACodePage: Cardinal): string; var MimeCPInfo: TMimeCPInfo; MultiLanguage: IMultiLanguage; begin if Succeeded(CoCreateInstance(CLASS_CMultiLanguage, nil, CLSCTX_INPROC_SERVER, IID_IMultiLanguage, MultiLanguage)) and Succeeded(MultiLanguage.GetCodePageInfo(ACodePage, MimeCPInfo)) then Result := string(MimeCPInfo.wszWebCharset) else Result := 'US-ASCII'; end; 
+2
source

I think you mean the LCIDToLocaleName function.

+1
source
 type TCPInfoEx = record MaxCharSize: UINT; DefaultChar: array[0..MAX_DEFAULTCHAR - 1] of Byte; LeadByte: array[0..MAX_LEADBYTES - 1] of Byte; UnicodeDefaultChar: WideChar; CodePage: UINT; CodePageName: array[0..MAX_PATH - 1] of Char; end; function GetCPInfoEx(CodePage: UINT; Flags: DWORD; var lpCPInfoEx: TCPInfoEx): BOOL; stdcall; external 'kernel32.dll' name 'GetCPInfoExA'; procedure TForm1.Button1Click(Sender: TObject); var CPInfoEx: TCPInfoEx; begin if GetCPInfoEx(28592, 0, CPInfoEx) then ShowMessage(CPInfoEx.CodePageName); end; 
0
source

Use the search, Luke. Just an old good text search. In RegEdit. For any short cp name you need :-) and remember that these identifiers are indeed MIME Internet identifiers

HKEY_CLASSES_ROOT \ MIME \ DataBase

http://msdn.microsoft.com/en-us/library/ms775147.aspx on this page hints that probably - perhaps this key exists with MSIE4 - in other words, starting with Windows 98

 uses {$IfDef MSWINDOWS}Registry, Windows, {$EndIf} AnsiStrings; /// todo - add implementation for non-Windows platforms /// if anyone would need it :-) /// probably via http://sourceforge.net/projects/natspec/ function CharSetByCodePage(const cp:Word): AnsiString; {$IfDef MSWINDOWS } var reg: TRegistry; begin // HKEY_CLASSES_ROOT\MIME\DataBase\Codepage reg := TRegistry.Create(KEY_READ); try reg.RootKey := HKEY_CLASSES_ROOT; if reg.OpenKeyReadOnly('MIME\DataBase\Codepage\' + IntToStr(cp)) then begin Result := Trim(AnsiString(reg.ReadString('WebCharset'))); // This key prevails, see #1251 for example if Result = '' then Result := Trim(AnsiString(reg.ReadString('BodyCharset'))); if Result > '' then exit; end; finally reg.Free; end; Raise EZXSaveException.Create('No charset (MIME id) found for codepage '+IntToStr(cp)); end; {$Else} begin Raise EZXSaveException.Create('Cannot get charset by numeric codepage on this platform.'); //not implemented, perhaps http://sourceforge.net/projects/natspec/ ? end; {$EndIf} 
0
source

Source: https://habr.com/ru/post/1305961/


All Articles