为了正确显示aisi文本,需要识别Codepage:例如: CP1255 1800 SAP Hebrew - ISO8859-8 - Not a complete match CP932 8000 SAP Shift-JIS CP950 8300 SAP Tranditional Chinese CP936 8400 SAP Simplified Chinese CP949 8500 SAP Korean CP874 8600 SAP Thai 经过下面的函数转换就能正常显示了,但是更特殊的字符,例如tm标记,需要Unicode采能支持显示function StringToWideString(const s: AnsiString; codePage: word): WideString; var l: integer; begin if s = '' then Result := '' else begin l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), -1, nil, 0); SetLength(Result, l-1); if l > 1 then MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]), -1, PWideChar(@Result[1]), l-1); end; end;
CP1255 1800 SAP Hebrew - ISO8859-8 - Not a complete match
CP932 8000 SAP Shift-JIS
CP950 8300 SAP Tranditional Chinese
CP936 8400 SAP Simplified Chinese
CP949 8500 SAP Korean
CP874 8600 SAP Thai 经过下面的函数转换就能正常显示了,但是更特殊的字符,例如tm标记,需要Unicode采能支持显示function StringToWideString(const s: AnsiString; codePage: word): WideString;
var
l: integer;
begin
if s = '' then
Result := ''
else begin
l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), -1, nil, 0);
SetLength(Result, l-1);
if l > 1 then
MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]), -1, PWideChar(@Result[1]), l-1);
end;
end;
\\\\\\\\\\\\\\\\\\\\
你给的函数在delphi 2010下没法编译,我把Pchar改成PAnsiChar后可以编译,但还是没能正常显示,codePage试了几个,如日文932,不知是否是这里出了问题.我百度了一下关于这个CodePage,不是很明白.
\\\\\\\\\\\\
我的TXT是ANSI格式的,我还试过逐个字节读入组成AnsiString,然后用1楼的函数转换,结果还是一样
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
function StringToWideString(const s: AnsiString; codePage: word): WideString;
var
l: integer;
begin
if s = '' then
Result := ''
else begin
l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PAnsiChar(@s[1]), -1, nil, 0);
SetLength(Result, l-1);
if l > 1 then
MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PAnsiChar(@s[1]), -1, PWideChar(@Result[1]), l-1);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
str1 = '俀丏僼傽僀儖峔惉';///
str2 = '羊囗溧痱磬 镳铞邃箴?钺疣犷蜿?铠栳铌, 耦忪羼蜩爨';
begin
memo1.Lines.Add(StringToWideString(str1, 932));
memo1.Lines.Add(StringToWideString(str2, 1251));
end;end.
/// memo1 显示如下:
/// Memo1
/// 2.ファイル構成
/// Стандартная процедур?обработк?ошибок, совместима
我调试后发现是我中间转换时出的问题,改正后确实正常了.