2015-11-09 7 views
2

У меня вопрос о коде, который мне нужно преобразовать строки UTF8 в строки ANSI. Мой код работает для акцентов в гласных, но с буквой Ѕ он не работает. Код разбивает строку. Как я могу исправить эту ошибку?Преобразование UTF8 в ANSI (ISO-8859-1) в Delphi

Строка Я имею в UTF8: EDIFICIO PEÃ'AS BLANCAS
Строка я бы в ANSI, если правильно: EDIFICIO Penas BLANCAS
Строка Я имею в ANSI в настоящее время: EDIFICIO PE

Кодекса находится здесь:

function TFormMain.convertir_utf8_ansi(const Source: string):string; 
    var 
     Iterator, SourceLength, FChar, NChar: Integer; 
    begin 
     Result := ''; 
     Iterator := 0; 
     SourceLength := Length(Source); 
     while Iterator < SourceLength do 
     begin 
      Inc(Iterator); 
      FChar := Ord(Source[Iterator]); 
      if FChar >= $80 then 
      begin 
      Inc(Iterator); 
      if Iterator > SourceLength then break; 
      FChar := FChar and $3F; 
      if (FChar and $20) <> 0 then 
      begin 
       FChar := FChar and $1F; 
       NChar := Ord(Source[Iterator]); 
       if (NChar and $C0) <> $80 then break; 
       FChar := (FChar shl 6) or (NChar and $3F); 
       Inc(Iterator); 
       if Iterator > SourceLength then break; 
      end; 
      NChar := Ord(Source[Iterator]); 
      if (NChar and $C0) <> $80 then break; 
      Result := Result + WideChar((FChar shl 6) or (NChar and $3F)); 
      end 
      else 
      Result := Result + WideChar(FChar); 
     end; 
    end; 

Спасибо.

+1

Какая версия Delphi? - от него зависит оптимальное решение. Добавьте соответствующий тег. –

+2

Первая строка, которую вы используете, не отображается как UTF-8. Это байты с кодировкой UTF-8, которые * интерпретируются как * что-то еще, возможно, ISO-8859-1 или Windows-1252. Если вы впервые интерпретировали свои байты UTF-8 как UTF-8, у вас, вероятно, не возникло бы этой проблемы. Что вы должны исследовать, откуда пришел «Источник» и почему это неправильно. –

+1

Звучит ужасно, как будто вы задали неправильный вопрос и попали в классическую проблему XY. –

ответ

2

Я решил проблему вызова, помимо функции, что я имел, внутреннюю функцию UTF8toAnsi. Я работаю над Delphi 2010.

Этот способ: Utf8toAnsi (convertir_utf8_ansi (source));

7

Если вы используете Delphi 2009 или выше, вы должны позволить RTL делать преобразования для вас:

type 
    Latin1String = type AnsiString(28591); // codepage 28591 = ISO-8859-1 
var 
    utf8: UTF8String; 
    latin1: Latin1String; 
begin 
    utf8 := ...; // your source UTF-8 string 
    latin1 := Latin1String(utf8); 
end; 

Если вы используете Delphi 2007 или более ранних версий, вы все равно можете сделать преобразование, просто дайте OS сделать это для вас:

var 
    utf8: UTF8String; 
    latin1: AnsiString; 
    ws: WideString; 
    len: Integer; 
begin 
    utf8 := ...; // your source UTF-8 string 
    len := MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(utf8), Length(utf8), nil, 0); 
    SetLength(ws, len); 
    MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(utf8), Length(utf8), PWideChar(ws), len); 
    len := WideCharToMultiByte(28591, 0, PWideChar(ws), Length(ws), nil, 0, nil, nil); 
    SetLength(latin1, len); 
    WideCharToMultiByte(28591, 0, PWideChar(ws), Length(ws), PAnsiChar(latin1), len, nil, nil); 
end; 

 Смежные вопросы

  • Нет связанных вопросов^_^