2016-12-03 2 views
1

Я хотел бы преобразовать строку CP-1253 в Unicode, а также выполнить обратное преобразование.преобразование строки из некоторой кодовой страницы в Юникод

Предположим, что у меня есть две переменные, содержащие строки, MySource1253 и MyUnicodeTarget.

  1. Я полагаю AnsiString быть подходящим типом для MySource1253, в то время как String должны быть пригодны для MyUnicodeTarget, пожалуйста, поправьте меня, если я ошибаюсь.

  2. Есть ли какая-то функция в Delphi XE, чтобы сделать эти преобразования от одного к другому и наоборот?

+0

Какую кодировку Юникода вы хотите использовать. В какой форме у вас есть данные. –

ответ

2

Declare:

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; 
Смежные вопросы