ããã¹ããã¡ã€ã«ãåã蟌ãã§å å·¥ããŠä¿åããããã°ã©ã ãæžããŠããã®ã§ãããäžéšã®æ¥æ¬èªãã¡ã€ã«ãæååãããããšã«å°ã£ãŠããŸãã
å
·äœçã«ã¯ãæ¢åã®ãã¡ã€ã«ïŒè€æ°éžæå¯ïŒããŠããããã䜿ã£ãŠå¥ã®ããã¹ããäœãïŒäž»ã«Appendã¡ãœãããªã©ïŒãæåŸã«ãããå¥åã§ä¿åããŠããŸãã
ãã¡ã€ã«ã®ããŒãã»ã»ãŒãã«ã¯ãšãã«TStringListã®LoadFromFileãšSaveToFileã䜿ã£ãŠããŸãã
ãã®æãäœããããã¡ã€ã«ã®äžéšãæååãããããšã«æ©ãŸãããŠããŸãã
ãæèŠããããããããšæããŸãã
ããã€ãã®å®éšã®çµæããã¡ã€ã«ã®ãšã³ã³ãŒãã«ãã£ãŠäžå
·åãçããã®ã§ã¯ãªãããšæã£ãã®ã§ãããããã§ããããã
ã»æååãããéšåãã¡ã¢åž³ãžã³ããŒããŠASCI圢åŒã§ä¿åããŠã¿ããšä»åºŠã¯æååãããªãã£ãã
ã»æååããããã¡ã€ã«ãåç¬ã§ïŒè€æ°ã®ãã¡ã€ã«ãéããã«ïŒäœ¿ãå Žåã«ã¯æååãããªãã£ãã
ã»ã¡ãªã¿ã«ãæååããããã¡ã€ã«ã¯UTF-8ãšãã圢åŒã«ãªã£ãŠããïŒãšæãããïŒãããã¯ãã€ã¯ã¡ã¢åž³ã§ã¯ãªãTextTreeãšããããªãŒãœããã§äœã£ããã®ã§ãã
ããŸãç¶æ³èª¬æã§ããªããŠç³ãèš³ãªãã®ã§ããããã²ã©ããªããšã§ããæèŠãããããããšæã£ãŠããŸãããããããé¡ãããŸãã
森
ããã¹ããã¡ã€ã«ã®æååãã®ä»¶ã§ããã
Delphi2007ãŸã§ã®TStringListã¯UNICODEé察å¿ã§ãã
ãšãããã䜿ããã®ã¯æ¥æ¬èªWindowsã§ã¯Shilt-JISã®ã¿ã§ãã
ãã®ããä»ã®ãšã³ã³ãŒããæ±ããšãã¯èªåã ãšçžåœãªåªåãå¿
èŠããšæããŸãã
çŸç¶ã§ããšTNTWareãšãããµã€ãã Unicode察å¿ã³ã³ããŒãã³ããå
¬éããŠãããŸ
ãã
赀尟éå¹³
赀尟ãããä»°ã£ãŠããŸãããæ¬¡ãããã®ããŒãžã§ã³ãŸã§ Unicode ã¯èªå
ã«ãªããŸãã
ãã¡ãã®ãµã€ããåèã«ãªããŸãâ
ã«ã«ãã»ãã©ã³ -ãDelphi ããŒãã¯Tipsã
http://cult-drang.com/program/tips/
o(^^ )o--------â^U)â¬â¬~...
Terry
ãåçããããšãããããŸããã
ããã¹ããã¡ã€ã«ã«ããããããããã§ãããã
å匷ã«ãªããŸããã
åœé¢ã¯ã圢åŒããæŽãã°èªã¿èŸŒããã®ã ãããŸãæ¥æ¬èªãã¡ã€ã«ãæ±ãããšã¯ãããŸã§å€ããªãã®ã§ããå Žåã«ãã£ãŠã¯æååããçºçããããã®å Žåã«ã¯åœ¢åŒãä¿®æ£ããŠä¿åããªããã°ããããšããããšã«ããŠããŒãžã§ã³ã®æ¹èšãåŸ
ã¡ãããšæããŸãã
èªåã§Unicodeãžã®å¯Ÿå¿ãçšæããã®ã¯å°ãè²»çšå¯Ÿå¹æãèŠåããªãã®ã§ãããã¯æ©äŒãããã°ãšããããšã«ããããŸãã
ã©ããããããšãããããŸããã
森
> èªåã§Unicodeãžã®å¯Ÿå¿ãçšæããã®ã¯å°ãè²»çšå¯Ÿå¹æãèŠåããªãã®ã§ã
>ããã¯æ©äŒãããã°ãšããããšã«ããããŸãã
System.Utf8ToAnsiã«ãŒãã³ã䜿ã£ãŠäœãšããªããŸããã§ããããã
以äžã¯ã¢ããªã±ãŒã·ã§ã³ãã©ã«ããŒå
ã«.NET Frameworkã®ã¢ããªã§äœæãã
UTF-8ã®ããã¹ããã¡ã€ã«'Test.txtãTMemoã³ã³ããŒãã³ãã«è¡šç€ºããããã®ã³ãŒãã§ãã
//ããã¯æååãããŸãã
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Test.txt');
end;
//以äžã®ã³ãŒãã§ã¯æ£åžžã«è¡šç€ºãããŸãã
procedure TForm1.Button2Click(Sender: TObject);
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Test.txt');
Memo1.Text := Utf8ToAnsi(sl.Text);
finally
sl.Free;
end;
end;
ãã¹ãããç°å¢ã¯ Windows XP SP2 + Delphi2005 ã§ãã
Delphi2005ããåã®ããŒãžã§ã³ã§Utf8ToAnsiã«ãŒãã³ãããã®ãã©ããã¯èª¿ã¹ãŠããŸããã
ç§èªèº«ãUnicodeã«ã¯è©³ãããªããããããã®ã¯äœ¿ã£ãŠããŸããçšåºŠã®æèŠã§ããã»ã»ã»(^_^;)
æ å ±ããããšãããããŸãã
ãŸã 詊ããŠã¯ããªãã®ã§ãããããŒãžã§ã³ã¯6.0ãªã®ã§äœ¿ããã®ã§ã¯ãªãããšæããŸãã
ãšããã§ããã®æ¹æ³ã䜿ãã«ããã£ãŠã¯ãã®ãã¡ã€ã«ãã©ã®åœ¢åŒã§æžãããŠããã®ããç¥ãå¿
èŠãããã®ã§ã¯ãªãããšæãã®ã§ããããã®ç¹ã¯ãããã§ããããã
UTF-8ã§æžãããŠããªããã¡ã€ã«ããã®é¢æ°ã«å
¥ããŠããŸã£ãŠã¯éã«ããããçµæã«ãªãã®ã§ã¯ãªãããšæãã®ã§ããããã®ç¹ã¯ã©ããªã®ã§ããããã
ãããããé¡ãããŸãã
森ã
2008/05/12 0:57 ç³å·å
倪é <gisi...@aqua.plala.or.jp>:
--
=======================
Kohta Mori
Graduate School of Economics
University of Tokyo
kmo...@yahoo.co.jp
=======================
远å ã§ãã
詊ããŠã¿ããšããããã¯ãUTF-8ã§æžãããšæããããã¡ã€ã«ã®ã¿ã¯æ£åžžã«è¡šç€ºããããšãåºæ¥ãŸãããããã®ä»ã®ãã¡ã€ã«ããããããªããŸããã
ãšããããã§ãã®ã§ãUTF-8ã§æžãããŠãããªããã®é¢æ°ãçšããŠãããã§ãªããªããã®ãŸãŸããšããã®ãè¯ããããªæ°ãããã®ã§ããããããããã¹ããã¡ã€ã«ã®åœ¢åŒãååŸããæ¹æ³ãåãããªãã§ããŸãã
ãã®ãããªããšã¯å¯èœãªã®ã§ããããã
森ã
2008/05/12 0:57 ç³å·å
倪é <gisi...@aqua.plala.or.jp>:
--
ããå¯Ÿè±¡ã®æç« ãããçšåºŠã®é·ããæã¡ãæåŸ
ãããããŒã¯ãŒããããã®ã§ããã°ããã®ãŸãŸèªã¿èŸŒãã§S-JISãšããŠæ€çŽ¢ããããããã°ãã®ãŸãŸ
æ€çŽ¢ã«ãããããªãããã¹ãã¯ãUTF-8ãã倿ããŠæ€çŽ¢ãäž¡è
ã§é§ç®ãªãã°ãäž¡è
ã§æ€çŽ¢ã§ããªã圢åŒãšããŠãæåã§å€æããã®ãè¯ãã®ã§ã¯ïŒ
> ãšããããã§ãã®ã§ãUTF-8ã§æžãããŠãããªããã®é¢æ°ãçšããŠãããã§ãªããªããã®ãŸãŸããšããã®ãè¯ããããªæ°ãããã®ã§ããããããããã¹ããã¡ã€ã«ã®åœ¢åŒãååŸããæ¹æ³ãåãããªãã§ããŸãã
> ãã®ãããªããšã¯å¯èœãªã®ã§ããããã
é¢å£
äžæãšãããŸãã
>ãšããããã§ãã®ã§ãUTF-8ã§æžãããŠãããªããã®é¢æ°ãçšããŠãããã§ãªããªãã
>ã®ãŸãŸããšããã®ãè¯ããããªæ°ãããã®ã§ããããããããã¹ããã¡ã€ã«ã®åœ¢åŒã
>ååŸããæ¹æ³ãåãããªãã§ããŸãã
>ãã®ãããªããšã¯å¯èœãªã®ã§ããããã
UTF-8ã®æåäœç³»ããUTF8ã§ãããã©ãããã ãããæ€èšä»ããããç°¡æå€å®
ã«ãŒãã³ãäœã£ãŠã¿ãŸããã
function TForm1.isUTF(AStr: String): Boolean;
var
I: Integer;
begin
I := 1;
while I <= Length(AStr) do
begin
case AStr[I] of
#$00..#$7f: inc(I);
#$c2..#$df: inc(I,2);
#$e0..#$ef: inc(I,3);
else begin
Result := false;
exit;
end;
end;
end;
Result := true;
end;
ãã£ã¡ãã¢ããŠããªã«ãŒãã³ã§ããïŒãããšæ£è§£ãåºããšæããŸããUTF-8ã
SJISãããªãå Žåã ã£ããïŒãã®ã«ãŒãã³ã§å€å®å¯èœãšæããŸããUTF16ããEUC
-JPãå
¥ã£ãŠãããšãªããšãæäžãã§ãã
ââââââââââââââââââââââââââââââââââ
âââ
âââãäžæãä¹
åžã(NAKAMURA, Hisashi)
âââãsunv...@sta.tenri-u.ac.jp
>ãããããã¹ããã¡ã€ã«ã®åœ¢åŒãååŸããæ¹æ³ãåãããªãã§ããŸãã
> ãã®ãããªããšã¯å¯èœãªã®ã§ããããã
IMultiLanguage2 COMãªããžã§ã¯ãã®DetectInputCodepageã¡ãœããã
䜿ãã®ãæ£æ»æ³ã®ããã§ãã
以äžã®XRAYããã®ããŒã ããŒãžã«Delphiã§ã®äœ¿çšäŸããããŸããã
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/886_ChangeCodePage.htm#04
ä»äºã§æéããªãã®ã§è©ŠããŠããŸããããæéãèŠã€ããŠç¢ºèªããããšæããŸãã
確èªã§ãããããŸããå ±åããããŸãã
ããããšãããããŸãïŒ
èªåãç®ãéããŠã¿ãŸãã
森
2008/05/13 9:33 ç³å·å 倪é <gisi...@aqua.plala.or.jp>:
--
ãªãã»ã©ãããããæãã®æ¹æ³ããããã§ãããå匷ã«ãªããŸãã
ä»åã¯ãæåŸ
ãããããŒã¯ãŒããšããã®ãå¿
ãããæãã€ããªãã§ããããããä»åŸã©ããã§å©çšããæ©äŒãããããã§ãã
ããããšãããããŸããã
森
2008/05/12 9:04 é¢å£ç³äž <mu...@ops.dti.ne.jp>:
--
ãªãã»ã©ãã©ãããä»çµã¿ãªã®ãæ£ç¢ºã«ã¯åãããªãã§ããããªããšãªããã£ãŠããããšã¯åãããŸãã
ïŒïŒïŒè³ªåããããŸãïŒãããäžæãã以å€ã®æ¹ã§ãæ§ããŸããïŒã
1. #$00ããšããã®ã¯ã©ãããæå³ã§ããïŒã$ã¯16鲿³ã瀺ãã®ã ã£ããšæããŸããã#ãã€ãããšã©ããªãã®ã§ããããã
2.
> #$00..#$7f: inc(I);
> #$c2..#$df: inc(I,2);
> #$e0..#$ef: inc(I,3);
ãšãã颚ã«ãã³ãŒãããšã«æååã®æ€çŽ¢äœçœ®ã®é²ã¿å ·åãç°ãªãã®ã¯ãªãã§ãããããã¯åè§ã»å šè§ãšããéãã§ããã
3.
> #$00..#$7f: inc(I);
> #$c2..#$df: inc(I,2);
> #$e0..#$ef: inc(I,3);
ãšããããã«ãããããããã¯æåãæ³å®ããããã®ã§ããããå€å®ããŠããã®ã ãšæãã®ã§ããããã®å¯Ÿè±¡æåã¯ç¶²çŸ çãªã®ã§ãããããæ°åã®æå³ã§ã¯ã7fãšc2ã®éã«ééããããŠããããã«æãã®ã§ãããããã¯ãªãã§ããã
4.
æåŸã«ãããã«çŸããŠããã³ãŒãïŒUTF-8ã ãšæããŸããïŒã®äžèŠ§è¡šãæ²èŒããŠãããµã€ããããã°æããŠãã ããããããããã£ãŠã©ããã©ããªã®ãå°ãæ··ä¹±ããŠããŸãã
森
2008/05/12 11:03 Sunvisor <sunv...@sta.tenri-u.ac.jp>:
--
>1. #$00ããšããã®ã¯ã©ãããæå³ã§ããïŒã$ã¯16鲿³ã瀺ãã®ã ã£ããšæããŸããã
>#ãã€ãããšã©ããªãã®ã§ããããã
æåãã£ã©ã¯ã¿ãšããããšã§ãã#9ãªãã¿ãïŒ#13ãªãæ¹è¡ãšããæãã§ãã䜿
ããŸãããã
>2.
>> #$00..#$7f: inc(I);
>> #$c2..#$df: inc(I,2);
>> #$e0..#$ef: inc(I,3);
>ãšãã颚ã«ãã³ãŒãããšã«æååã®æ€çŽ¢äœçœ®ã®é²ã¿å
·åãç°ãªãã®ã¯ãªãã§ãããã
>ãã¯åè§ã»å
šè§ãšããéãã§ããã
>
>3.
>> #$00..#$7f: inc(I);
>> #$c2..#$df: inc(I,2);
>> #$e0..#$ef: inc(I,3);
>ãšããããã«ãããããããã¯æåãæ³å®ããããã®ã§ããããå€å®ããŠããã®ã ãš
>æãã®ã§ããããã®å¯Ÿè±¡æåã¯ç¶²çŸ
çãªã®ã§ãããããæ°åã®æå³ã§ã¯ã7fãšc2ã®é
>ã«ééããããŠããããã«æãã®ã§ãããããã¯ãªãã§ããã
>
>4.
>æåŸã«ãããã«çŸããŠããã³ãŒãïŒUTF-8ã ãšæããŸããïŒã®äžèŠ§è¡šãæ²èŒããŠãããµ
>ã€ããããã°æããŠãã ããããããããã£ãŠã©ããã©ããªã®ãå°ãæ··ä¹±ããŠããŸãã
ãã®caseæã¯ïŒWikipediaã«èŒã£ãŠããUTF-8ã®é ç®ããäœããŸããã
http://ja.wikipedia.org/wiki/UTF-8
UTF-8ã¯ïŒãã€ãç®ãèŠããšãã®æåãäœãã€ãã§æ§æãããŠããããããããŸ
ããããã§ã³ãŒãæ¯ã«é²ã¿å
·åãå€ããã®ã§ãããæå€§ïŒãã€ãã§æ§æãããã
ãšããããããªã®ã§ããïŒæ¥æ¬èªã®å Žåã¯ïŒãã€ããŸã§ã®ããã§ãã®ã§ïŒããã
ãããã³ãŒãã£ã³ã°ããŠãŸããããã®å€å®æ¹æ³ã§ã¯ïŒïŒãã€ãç®ã«UTF-8ã§èš±ã
ããŠããªãæåãåºãŠãããã©ããã§å€å®ããŠããŸããéåžžã«ä¹±æŽãªå€å®æ¹æ³ãª
ãã§ããïŒS-JISã®æ¥æ¬èªæååãå
¥ãããšã»ãšãã©FALSEãè¿ããŸãã®ã§ïŒãªã
ãšããããªãã«å€å®ã§ããŠããããã§ãã
å
æ¥ã話ããIMultiLanguage2 COMãªããžã§ã¯ãã®DetectInputCodepageã¡ãœããã
ã䜿ã£ãŠããã¹ããã¡ã€ã«ã®ãšã³ã³ãŒãã調ã¹ãæ¹æ³ã§ãããXRAYããã®ããŒã ããŒãž
ã«æžãããŠããå
容ãåèã«ãããã¹ããã¡ã€ã«ãšã³ã³ãŒãã®ã³ãŒãããŒãžãååŸ
ãã颿°(GetTextFileCodePage)ãäœã£ãŠã¿ãŸããã
å人çã«ã¯ããããã¯äœ¿ããïŒããšæãã®ã§ããã»ã»ã»ã
æ¯éãšã確èªããŠãã ããã
ãã®ãããé·æã«ãªããŸãããå šã³ãŒããæ²èŒããŸãã
ãŸããã³ããã¿ã«ããMyWindows.pasãäœæããŠãã ããã
次ã«ãã¡ã€ã³ãã©ãŒã ã«ãã¿ã³ãšSaveDialogãããããããŠããã©ãŒã ã®OnCreateã
OnDestroyã€ãã³ããšãã¿ã³ã®OnClickã€ãã³ããã³ãã©ã®äžèº«ãã³ããã¿ããŠãã ããã
ãã¿ã³ã®OnClickã€ãã³ãã§ã¯ã³ãŒãããŒãžã®ååãåç
§ããããã«GetCPInfoEx APIã
䜿çšããŠããŸãããGetCPInfoEx APIã¯VCLã§å®£èšãããŠããªãã®ã§ãMyWindows.paså
ã§
宣èšããŸããã
å®è¡ããŠã¿ããšãShift-JISã®ããã¹ããã¡ã€ã«ã®å Žåã¯
ããCodePage = 932
ããCodePageName = 932 (ANSI/OEM - æ¥æ¬èª Shift-JIS)
ãšè¡šç€ºãããŸããGetTextFileCodePageã®æ»ãå€ã932ã§ããã°Shift-JISã®ããã¹ã
ãã¡ã€ã«ã ãšããããšã§ãã
UTF-8ã®ããã¹ããã¡ã€ã«ã®å Žåã¯
ããCodePage = 65001
ããCodePageName = 65001 (UTF-8)
ãšè¡šç€ºãããŸããGetTextFileCodePageã®æ»ãå€ã65001ã§ããã°UTF-8ã§ãšã³ã³ãŒã
ãããããã¹ããã¡ã€ã«ã ãšããããšã§ãã
GetTextFileCodePageã®æ»ãå€ã65001ã®å Žåã ãUtf8ToAnsiã«ãŒãã³ãããŸããŠããã
ãã®ä»ã®å Žåã¯ãéåžžã®åŠçãšããã®ã¯ã©ãã§ããããã
ãã¡ãããShift-JISãšUTF-8以å€ã®åœ¢åŒã®ããã¹ããã¡ã€ã«ã¯æååãããŠããŸããŸããã
ããããã±ãŒã¹ã¯ã¬ã¢ã§ãããã®ãšããŠã»ã»ã»ã
ã¡ãªã¿ã«ãPCã«ã€ã³ã¹ããŒã«ãããŠããã³ãŒãããŒãžããªã¹ãã¢ããããã«ã¯ã
EnumSystemCodePages APIã䜿ããŸããããã¯WindowsãŠãããã«å®£èšãããŠããŸãã
åèã«ããMultiLanguageã¿ã€ãã©ã€ãã©ãªãªãããªããMSDNã調ã¹ãŠã¿ããšã
ä»»æã®åœ¢åŒã®ããã¹ããã¡ã€ã«ãShift-JISã«å€æããæ¹æ³ãèŠã€ããã®ãããããŸãããã
ã¡ãã£ãšãããŸã§ããæ°åã¯ãããŸããã
ã§ãã.NET Frameworkã®ã¢ããªãå¹
ãå©ãããŠããããUniCodeã®ããã¹ããã¡ã€ã«ãš
Shift-JISã®ããã¹ããã¡ã€ã«ãæ°Ÿæ¿«ããŠã森ããããã£ãŠãããããããªåŠçãå¿
èŠ
ã«ãªãããšã«ãªããããªæ°ãããããŸãã
å°ãã§ããæ£®ããã®åèã«ãªããŸããã幞ãã§ãã
ããã§ã¯ã
//
// MyWindows.pas
//
unit MyWindows;
interface
uses
Windows, ActiveX, Classes;
{
MultiLanguageã¿ã€ãã©ã€ãã©ãªããã®æç²
åºå
žïŒhttp://www.delphikingdom.com/asp/answer.asp?IDAnswer=16895
}
const
CLASS_CMultiLanguage: TGUID
= '{275C23E2-3747-11D0-9FEA-00AA003F8646}';
IID_IMultiLanguage2: TGUID
= '{DCCFC164-2B38-11D2-B7EC-00C04F8F5D9A}';
type
tagMIMECPINFO = packed record
dwFlags: LongWord;
uiCodePage: SYSUINT;
uiFamilyCodePage: SYSUINT;
wszDescription: array[0..63] of Word;
wszWebCharset: array[0..49] of Word;
wszHeaderCharset: array[0..49] of Word;
wszBodyCharset: array[0..49] of Word;
wszFixedWidthFont: array[0..31] of Word;
wszProportionalFont: array[0..31] of Word;
bGDICharset: Byte;
end;
tagMIMECSETINFO = packed record
uiCodePage: SYSUINT;
uiInternetEncoding: SYSUINT;
wszCharset: array[0..49] of Word;
end;
tagRFC1766INFO = packed record
lcid: LongWord;
wszRfc1766: array[0..5] of Word;
wszLocaleName: array[0..31] of Word;
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;
tagMIMECONTF = TOleEnum;
tagSCRIPTINFO = packed record
ScriptId: Byte;
uiCodePage: SYSUINT;
wszDescription: array[0..47] of Word;
wszFixedWidthFont: array[0..31] of Word;
wszProportionalFont: array[0..31] of Word;
end;
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;
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;
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: Word;
var pcDstSize: SYSUINT): HResult; stdcall;
function DoConversionFromUnicode(
var pSrcStr: Word;
var pcSrcSize: SYSUINT;
var pDstStr: Shortint;
var pcDstSize: SYSUINT): HResult; stdcall;
end;
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;
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: Word;
var pcDstSize: SYSUINT): HResult; stdcall;
function ConvertStringFromUnicode(
var pdwMode: LongWord;
dwEncoding: LongWord;
var pSrcStr: Word;
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: Word;
dwSrcEncoding: LongWord;
dwDstEncoding: LongWord;
const pstmIn: ISequentialStream;
const pstmOut: ISequentialStream): HResult; stdcall;
function ConvertStringToUnicodeEx(
var pdwMode: LongWord;
dwEncoding: LongWord;
var pSrcStr: Shortint;
var pcSrcSize: SYSUINT;
var pDstStr: Word;
var pcDstSize: SYSUINT;
dwFlag: LongWord;
var lpFallBack: Word): HResult; stdcall;
function ConvertStringFromUnicodeEx(
var pdwMode: LongWord;
dwEncoding: LongWord;
var pSrcStr: Word;
var pcSrcSize: SYSUINT;
var pDstStr: Shortint;
var pcDstSize: SYSUINT;
dwFlag: LongWord;
var lpFallBack: Word): HResult; stdcall;
function DetectCodepageInIStream(
dwFlag: LongWord;
dwPrefWinCodePage: LongWord;
const pstmIn: ISequentialStream;
var lpEncoding: tagDetectEncodingInfo;
var pnScores: SYSINT): HResult; stdcall;
function DetectInputCodepage(
dwFlag: LongWord;
dwPrefWinCodePage: LongWord;
var pSrcStr: Char; //ShortIntããCharã«å€æŽ
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;
{
ããã¹ããã¡ã€ã«ã®ã³ãŒãããŒãžãååŸãã颿°
åèïŒhttp://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/886_ChangeCodePage.htm#04
}
function GetTextFileCodePage(const FileName: string): Integer;
{
kernel32.dllã®GetCPInfoExAãéçã«ãªã³ã¯
}
type
PCpInfoEx = ^TCpInfoEx;
TCpInfoEx = record
MaxCharSize: UINT;
DefaultChar: array [0..MAX_DEFAULTCHAR - 1] of BYTE;
LeadByte: array [0..MAX_LEADBYTES - 1] of BYTE;
UnicodeDefaultChar: WCHAR;
CodePage: UINT;
CodePageName: array [0..MAX_PATH - 1] of CHAR;
end;
function GetCPInfoEx(
CodePage: UINT;
dwFlags: DWORD;
lpCPInfoEx: PCpInfoEx): BOOL; stdcall;
implementation
function GetTextFileCodePage(const FileName: string): Integer;
var
hr : HRESULT;
ms : TMemoryStream;
mLang : IMultiLanguage2;
dwFlag : DWORD;
arSrcStr : array of Char;
srcSize : SYSINT;
encoding : tagDetectEncodingInfo;
scores : SYSINT;
begin
Result := 0;
hr := CoCreateInstance(
CLASS_CMultiLanguage,
nil,
CLSCTX_INPROC_SERVER,
IID_IMultiLanguage2,
mLang);
if hr = S_OK then
begin
ms := TMemoryStream.Create;
try
ms.Clear;
ms.LoadFromFile(FileName);
srcSize := ms.Size + 2;
SetLength(arSrcStr, srcSize);
ms.Position :=0;
ms.Read(arSrcStr[0], ms.Size);
dwFlag := 0;
scores := 1;
hr := mLang.DetectInputCodepage(
dwFlag, 0, arSrcStr[0], srcSize, encoding, scores);
if hr = S_OK then begin
Result := Encoding.nCodePage;
end;
finally
ms.Free;
mLang := nil;
end;
end;
end;
function GetCPInfoEx; external kernel32 name 'GetCPInfoExA';
end.
//
// ãã¹ãçšã¡ã€ã³ãã©ãŒã
// ãã¿ã³ãšSaveDialogãã
//
unit FormTest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm4 = class(TForm)
OpenDialog1: TOpenDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private å®£èš }
public
{ Public å®£èš }
end;
var
Form4: TForm4;
implementation
uses
ActiveX, MyWindows;
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
begin
CoInitialize(nil);
OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
end;
procedure TForm4.FormDestroy(Sender: TObject);
begin
CoUninitialize;
end;
procedure TForm4.Button1Click(Sender: TObject);
var
codePage: Integer;
codePageInfo: TCpInfoEx;
codePageName: string;
begin
if OpenDialog1.Execute then
begin
codePage := GetTextFileCodePage(OpenDialog1.FileName);
if GetCPInfoEx(codePage, 0, @codePageInfo) then
codePageName := codePageInfo.CodePageName
else
codePageName := 'äžæ';
MessageDlg('CodePage = ' + IntToStr(codePage) + sLineBreak
+ 'CodePageName = ' + codePageName, mtInformation, [mbOK], 0);
end;
end;
end.
è¿ããã¡ã«è©ŠããŠã¿ãããšæããŸããããã°ãããåŸ
ã¡ãã ããã
ãšãããããã瀌ãé
ããŠã¯å€±ç€Œãªã®ã§ããšããããã瀌ãŸã§ã
森
2008/05/17 2:51 ç³å·å 倪é <gisi...@aqua.plala.or.jp>:
--