2011-11-01 47 views
1

對於已與當前操作系統語言環境中創建的文本文件HTTP上傳,我想生成頭狀如何從當前Windows語言環境獲取HTTP字符集名稱?

Content-Type: text/plain; charset=iso-8859-2 

,使文本的服務器正確處理。是否有一個Windows API函數返回給定語言環境ID的字符串?

+0

@TLama:這將返回「爲0x10407區域設置名稱是去DE_phoneb」,但我需要的字符集,而不是在HTTP頭 – mjn

+0

請參見locale名http://stackoverflow.com/questions/2574289/ codepage-code-codepage-name-getencoding-equivalent-in-delphi/ – mjn

回答

0

您可以使用GetLocaleInfo來獲取字符集信息。

+3

我不知道這個答案在他已經使用它並沒有得到所需結果時是如何有用的。 –

+2

wtf?這種接受需要一些解釋。 –

+0

看我的編輯 - 這是有幫助的,我使用GetLocaleInfo和地圖來找到相應的字符集名稱 – mjn

0

由於Stefans鏈路,我能夠部分地解決該問題:這個代碼顯示,根據MSDN其具有「.NET名稱」 窗口1252

更新:從集到代碼頁標識符映射可以協議來完成\包含在互聯網直接(印)IdCharsets

program Project22; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Windows, Dialogs; 

const 
    ID = LOCALE_IDEFAULTANSICODEPAGE; 
var 
    BufSize: Integer; 
    Result: string; 
begin 
    BufSize := GetLocaleInfo(GetUserDefaultLCID, ID, nil, 0); 
    SetLength(Result, BufSize); 
    GetLocaleinfo(GetUserDefaultLCID, ID, PChar(Result), BufSize); 
    SetLength(Result, BufSize - 1); 
    ShowMessage(Result); 
end. 
2

以下是使用IMultiLanguage2接口的代碼。我不知道GetCodePageInfo是否覆蓋了所有的代碼頁(我害怕因爲this答案的評論),但我不知道如何驗證它。

const 
    IID_IMultiLanguage2: TGUID = '{DCCFC164-2B38-11D2-B7EC-00C04F8F5D9A}'; 
    CLSID_CMultiLanguage: TGUID = '{275C23E2-3747-11D0-9FEA-00AA003F8646}'; 

type 
    tagMIMECPINFO = packed record 
    dwFlags: LongWord; 
    uiCodePage: SYSUINT; 
    uiFamilyCodePage: SYSUINT; 
    wszDescription: array[0..63] of WideChar; 
    wszWebCharset: array[0..49] of WideChar; 
    wszHeaderCharset: array[0..49] of WideChar; 
    wszBodyCharset: array[0..49] of WideChar; 
    wszFixedWidthFont: array[0..31] of WideChar; 
    wszProportionalFont: array[0..31] of WideChar; 
    bGDICharset: Byte; 
    padding : array [0..2] of Byte; 
    end; 

    tagMIMECSETINFO = packed record 
    uiCodePage: SYSUINT; 
    uiInternetEncoding: SYSUINT; 
    wszCharset: array[0..49] of WideChar; 
    end; 

    tagRFC1766INFO = packed record 
    lcid: LongWord; 
    wszRfc1766: array[0..5] of WideChar; 
    wszLocaleName: array[0..31] of WideChar; 
    end; 

    tagDetectEncodingInfo = packed record 
    nLangID: SYSUINT; 
    nCodePage: SYSUINT; 
    nDocPercent: SYSINT; 
    nConfidence: SYSINT; 
    end; 

    __MIDL_IWinTypes_0009 = record 
    case Integer of 
     0: (hInproc: Integer); 
     1: (hRemote: Integer); 
    end; 

    _RemotableHandle = packed record 
    fContext: Integer; 
    u: __MIDL_IWinTypes_0009; 
    end; 

    tagSCRIPTINFO = packed record 
    ScriptId: Byte; 
    uiCodePage: SYSUINT; 
    wszDescription: array[0..47] of WideChar; 
    wszFixedWidthFont: array[0..31] of WideChar; 
    wszProportionalFont: array[0..31] of WideChar; 
    end; 

type 
    tagMIMECONTF = (
    MIMECONTF_MAILNEWS = $00000001, 
    MIMECONTF_BROWSER = $00000002, 
    MIMECONTF_MINIMAL = $00000004, 
    MIMECONTF_IMPORT = $00000008, 
    MIMECONTF_SAVABLE_MAILNEWS = $00000100, 
    MIMECONTF_SAVABLE_BROWSER = $00000200, 
    MIMECONTF_EXPORT = $00000400, 
    MIMECONTF_PRIVCONVERTER = $00010000, 
    MIMECONTF_VALID = $00020000, 
    MIMECONTF_VALID_NLS = $00040000, 
    MIMECONTF_MIME_IE4 = $10000000, 
    MIMECONTF_MIME_LATEST = $20000000, 
    MIMECONTF_MIME_REGISTRY = $40000000 
); 

// *********************************************************************// 
// Interface: IEnumCodePage 
// Flags:  (0) 
// GUID:  {275C23E3-3747-11D0-9FEA-00AA003F8646} 
// *********************************************************************// 
    IEnumCodePage = interface(IUnknown) 
    ['{275C23E3-3747-11D0-9FEA-00AA003F8646}'] 
    function Clone(out ppEnum: IEnumCodePage): HResult; stdcall; 
    function Next(celt: LongWord; out rgelt: tagMIMECPINFO; out pceltFetched: LongWord): HResult; stdcall; 
    function Reset: HResult; stdcall; 
    function Skip(celt: LongWord): HResult; stdcall; 
    end; 

// *********************************************************************// 
// Interface: IEnumRfc1766 
// Flags:  (0) 
// GUID:  {3DC39D1D-C030-11D0-B81B-00C04FC9B31F} 
// *********************************************************************// 
    IEnumRfc1766 = interface(IUnknown) 
    ['{3DC39D1D-C030-11D0-B81B-00C04FC9B31F}'] 
    function Clone(out ppEnum: IEnumRfc1766): HResult; stdcall; 
    function Next(celt: LongWord; out rgelt: tagRFC1766INFO; out pceltFetched: LongWord): HResult; stdcall; 
    function Reset: HResult; stdcall; 
    function Skip(celt: LongWord): HResult; stdcall; 
    end; 

// *********************************************************************// 
// Interface: IMLangConvertCharset 
// Flags:  (0) 
// GUID:  {D66D6F98-CDAA-11D0-B822-00C04FC9B31F} 
// *********************************************************************// 
    IMLangConvertCharset = interface(IUnknown) 
    ['{D66D6F98-CDAA-11D0-B822-00C04FC9B31F}'] 
    function Initialize(uiSrcCodePage: SYSUINT; uiDstCodePage: SYSUINT; dwProperty: LongWord): HResult; stdcall; 
    function GetSourceCodePage(out puiSrcCodePage: SYSUINT): HResult; stdcall; 
    function GetDestinationCodePage(out puiDstCodePage: SYSUINT): HResult; stdcall; 
    function GetProperty(out pdwProperty: LongWord): HResult; stdcall; 
    function DoConversion(var pSrcStr: Byte; var pcSrcSize: SYSUINT; var pDstStr: Byte; 
     var pcDstSize: SYSUINT): HResult; stdcall; 
    function DoConversionToUnicode(var pSrcStr: Shortint; var pcSrcSize: SYSUINT; var pDstStr: Smallint; 
     var pcDstSize: SYSUINT): HResult; stdcall; 
    function DoConversionFromUnicode(var pSrcStr: Smallint; var pcSrcSize: SYSUINT; var pDstStr: Shortint; 
     var pcDstSize: SYSUINT): HResult; stdcall; 
    end; 

// *********************************************************************// 
// Interface: IEnumScript 
// Flags:  (0) 
// GUID:  {AE5F1430-388B-11D2-8380-00C04F8F5DA1} 
// *********************************************************************// 
    IEnumScript = interface(IUnknown) 
    ['{AE5F1430-388B-11D2-8380-00C04F8F5DA1}'] 
    function Clone(out ppEnum: IEnumScript): HResult; stdcall; 
    function Next(celt: LongWord; out rgelt: tagSCRIPTINFO; out pceltFetched: LongWord): HResult; stdcall; 
    function Reset: HResult; stdcall; 
    function Skip(celt: LongWord): HResult; stdcall; 
    end; 

// *********************************************************************// 
// Interface: IMultiLanguage2 
// Flags:  (0) 
// GUID:  {DCCFC164-2B38-11D2-B7EC-00C04F8F5D9A} 
// *********************************************************************// 
    IMultiLanguage2 = interface(IUnknown) 
    ['{DCCFC164-2B38-11D2-B7EC-00C04F8F5D9A}'] 
    function GetNumberOfCodePageInfo(out pcCodePage: SYSUINT): HResult; stdcall; 
    function GetCodePageInfo(uiCodePage: SYSUINT; LangId: Word; out pCodePageInfo: tagMIMECPINFO): HResult; stdcall; 
    function GetFamilyCodePage(uiCodePage: SYSUINT; out puiFamilyCodePage: SYSUINT): HResult; stdcall; 
    function EnumCodePages(grfFlags: LongWord; LangId: Word; out ppEnumCodePage: IEnumCodePage): HResult; stdcall; 
    function GetCharsetInfo(const Charset: WideString; out pCharsetInfo: tagMIMECSETINFO): HResult; stdcall; 
    function IsConvertible(dwSrcEncoding: LongWord; dwDstEncoding: LongWord): HResult; stdcall; 
    function ConvertString(var pdwMode: LongWord; dwSrcEncoding: LongWord; dwDstEncoding: LongWord; 
     var pSrcStr: Byte; var pcSrcSize: SYSUINT; var pDstStr: Byte; var pcDstSize: SYSUINT): HResult; stdcall; 
    function ConvertStringToUnicode(var pdwMode: LongWord; dwEncoding: LongWord; var pSrcStr: Shortint; 
     var pcSrcSize: SYSUINT; var pDstStr: Smallint; var pcDstSize: SYSUINT): HResult; stdcall; 
    function ConvertStringFromUnicode(var pdwMode: LongWord; dwEncoding: LongWord; var pSrcStr: Smallint; 
     var pcSrcSize: SYSUINT; var pDstStr: Shortint; var pcDstSize: SYSUINT): HResult; stdcall; 
    function ConvertStringReset: HResult; stdcall; 
    function GetRfc1766FromLcid(locale: LongWord; out pbstrRfc1766: WideString): HResult; stdcall; 
    function GetLcidFromRfc1766(out plocale: LongWord; const bstrRfc1766: WideString): HResult; stdcall; 
    function EnumRfc1766(LangId: Word; out ppEnumRfc1766: IEnumRfc1766): HResult; stdcall; 
    function GetRfc1766Info(locale: LongWord; LangId: Word; out pRfc1766Info: tagRFC1766INFO): HResult; stdcall; 
    function CreateConvertCharset(uiSrcCodePage: SYSUINT; uiDstCodePage: SYSUINT; dwProperty: LongWord; 
     out ppMLangConvertCharset: IMLangConvertCharset): HResult; stdcall; 
    function ConvertStringInIStream(var pdwMode: LongWord; dwFlag: LongWord; var lpFallBack: Smallint; 
     dwSrcEncoding: LongWord; dwDstEncoding: LongWord; const pstmIn: IStream; const pstmOut: IStream): HResult; stdcall; 
    function ConvertStringToUnicodeEx(var pdwMode: LongWord; dwEncoding: LongWord; var pSrcStr: Shortint; 
     var pcSrcSize: SYSUINT; var pDstStr: Smallint; var pcDstSize: SYSUINT; dwFlag: LongWord; 
     var lpFallBack: Smallint): HResult; stdcall; 
    function ConvertStringFromUnicodeEx(var pdwMode: LongWord; dwEncoding: LongWord; var pSrcStr: Smallint; 
     var pcSrcSize: SYSUINT; var pDstStr: Shortint; var pcDstSize: SYSUINT; dwFlag: LongWord; 
     var lpFallBack: Smallint): HResult; stdcall; 
    function DetectCodepageInIStream(dwFlag: LongWord; dwPrefWinCodePage: LongWord; const pstmIn: IStream; 
     var lpEncoding: tagDetectEncodingInfo; var pnScores: SYSINT): HResult; stdcall; 
    function DetectInputCodepage(dwFlag: LongWord; dwPrefWinCodePage: LongWord; var pSrcStr: Shortint; 
     var pcSrcSize: SYSINT; var lpEncoding: tagDetectEncodingInfo; var pnScores: SYSINT): HResult; stdcall; 
    function ValidateCodePage(uiCodePage: SYSUINT; var hwnd: _RemotableHandle): HResult; stdcall; 
    function GetCodePageDescription(uiCodePage: SYSUINT; lcid: LongWord; lpWideCharStr: PWideChar; 
     cchWideChar: SYSINT): HResult; stdcall; 
    function IsCodePageInstallable(uiCodePage: SYSUINT): HResult; stdcall; 
    function SetMimeDBSource(dwSource: tagMIMECONTF): HResult; stdcall; 
    function GetNumberOfScripts(out pnScripts: SYSUINT): HResult; stdcall; 
    function EnumScripts(dwFlags: LongWord; LangId: Word; out ppEnumScript: IEnumScript): HResult; stdcall; 
    function ValidateCodePageEx(uiCodePage: SYSUINT; var hwnd: _RemotableHandle; dwfIODControl: LongWord): HResult; stdcall; 
    end; 

function GetSystemDefaultUILanguage: LANGID; stdcall; external kernel32 name 'GetSystemDefaultUILanguage'; 

implementation 

function CodePageToCharSet(const ACodePage: Cardinal; const ALangID: LANGID): string; 
var 
    CodePageInfo: tagMIMECPINFO; 
    MultiLanguage: IMultiLanguage2; 
begin 
    Result := ''; 

    if CoCreateInstance(CLSID_CMultiLanguage, nil, CLSCTX_INPROC_SERVER, IID_IMultiLanguage2, MultiLanguage) = S_OK then 
    if MultiLanguage.GetCodePageInfo(ACodePage, ALangID, CodePageInfo) = S_OK then 
     Result := CodePageInfo.wszWebCharset; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ShowMessage(LowerCase(CodePageToCharSet(GetACP, GetSystemDefaultUILanguage))); 
end; 
+0

您可以檢查[這裏](http://uploading.com/files/4985a665/Code%2BPage%2BIdentifiers.pdf/)通過調用[GetCodePageInfo](http://msdn.microsoft.com/en-us/library/aa740992%28v=VS),您提到的.NET別名和'tagMIMECPINFO.wszWebCharset'的結果的比較表。 85%29.aspx)。 – TLama

相關問題