2016-12-03 89 views
1

我想将CP-1253字符串转换为Unicode,并且也执行相反的转换。将字符串从某些代码页转换为Unicode

假设我有两个变量持有字符串,MySource1253MyUnicodeTarget

  1. 我相信AnsiString成为MySource1253合适的类型,而String应该MyUnicodeTarget是合适的,请纠正我,如果我错了。

  2. Delphi XE中是否有一些功能可以将这些转换从一个转换为另一个,反之亦然?

+0

你想使用哪种Unicode编码。你有什么样的表格数据。 –

回答

2

声明:本

type 
    GreekString = type Ansistring(1253); 

并在它们之间进行转换,只需使用下面的代码:

var 
    UnicodeStr: string; 
    GreekStr: GreekString; 
begin 
    UnicodeStr := 'This is a test.'; // Unicode string 
    GreekStr := GreekString(UnicodeStr); // ...converted to 1253 

    GreekStr := 'This is a test.'; // Greek string 
    UnicodeStr := string(GreekStr); // ...converted to Unicode 
end; 

参见:How can I convert string encoded with Windows Codepage 1251 to a Unicode string

+0

当进行转换时,你必须使用显式的类型转换来避免编译器的“隐式转换”警告。 Unicode <-> Ansi转换可能有损耗,因此您必须告诉编译器您了解并接受该风险。另外,RTL还有'LocaleCharsFromUnicode()'和'UnicodeFromLocaleChars()'函数,它们在字符缓冲区而不是字符串上运行。 –

0

只需调用RawByteStringToUnicodeString并将您的AnsiString作为第一个参数,并将代码页(1253)作为第二个参数传递。

MyUnicodeString := RawByteStringToUnicodeString(MyAnsiString, 1253); 

这里是从AnsiString(RawByteString)转换为Unicode和返回的函数。它们是Win32 MultiByteToWideChar/WideCharToMultiByte的安全包装。

uses 
    Windows, Math; 


function RawByteStringToUnicodeString(const S: RawByteString; CP: Integer): UnicodeString; 
var 
    P: PAnsiChar; 
    pw: PWideChar; 
    I, J: Integer; 
begin 
    Result := ''; 
    if S = '' then 
    Exit; 
    if CP = CP_UTF8 then 
    begin 
    // UTF8 
    Result := UTF8ToUnicodeString(S); 
    Exit; 
    end; 
    P := @S[1]; 
    I := MultiByteToWideChar(CP, 0, P, Length(S), nil, 0); 
    if I <= 0 then 
    Exit; 
    SetLength(Result, I); 
    pw := @Result[1]; 
    J := MultiByteToWideChar(CP, 0, P, Length(S), pw, I); 
    if I <> J then 
    SetLength(Result, Min(I, J)); 
end; 


function UnicodeStringToRawByteString(const w: UnicodeString; CP: Integer): RawByteString; 
var 
    P: PWideChar; 
    I, J: Integer; 
begin 
    Result := ''; 
    if w = '' then 
    Exit; 
    case CP of 
    CP_UTF8: 
     begin 
     // UTF8 
     Result := UTF8Encode(w); 
     Exit; 
     end; 
    CP_UNICODE_LE: 
     begin 
     // Unicode codepage 
     CP := CP_ACP; 
     end; 
    end; 

    P := @w[1]; 
    I := WideCharToMultibyte(CP, 0, P, Length(w), nil, 0, nil, nil); 
    if I <= 0 then 
    Exit; 
    SetLength(Result, I); 
    J := WideCharToMultibyte(CP, 0, P, Length(w), @Result[1], I, nil, nil); 
    if I <> J then 
    SetLength(Result, Min(I, J)); 
    SetCodePage(Result, CP, False); 
end; 
相关问题