Delphi windows 1251 to utf 8

Programmer1993

44 / 24 / 1

Регистрация: 22.05.2012

Сообщений: 669

1

06.01.2015, 20:49. Показов 26503. Ответов 10

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

есть программа которая берет вордовский файл и конвертирует его в .txt. Но вот на выходе файл в кодировке windows-1251, а мне нужен на выходе чтоб был в utf-8. Помогите это сделать.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.Button1Click(Sender: TObject);
var W:variant;
var f:TextFile;
var st:string;
begin
 
if OpenDialog1.Execute then // если выбрали файл *.doc то....
 begin
 W:=CreateOleObject('Word.Application');// создаем объект для работы с ворд
 W.Documents.Open(OpenDialog1.FileName,ReadOnly:=true);
 st:=W.ActiveDocument.Range.Text;
 //------------работа с файлом------------------
 
 f:=windows-1251ToUtf8(f);
 AssignFile(f,'word.txt');
 Rewrite(f);
 Write(f,st);
 closeFile(f);
 
// убираем объект W из памяти
W.Quit;
W:=UnAssigned;
 end;
 
end;



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

06.01.2015, 20:49

10

Эксперт Pascal/Delphi

4901 / 2771 / 851

Регистрация: 04.10.2012

Сообщений: 10,095

06.01.2015, 21:03

2

Цитата
Сообщение от Programmer1993
Посмотреть сообщение

на выходе файл в кодировке windows-1251, а мне нужен на выходе чтоб был в utf-8

AnsiToUTF8().



1



44 / 24 / 1

Регистрация: 22.05.2012

Сообщений: 669

06.01.2015, 21:23

 [ТС]

3

не катит

Миниатюры

Перекодирование из windows-1251 в utf-8
 



0



droider

Эксперт Pascal/Delphi

4901 / 2771 / 851

Регистрация: 04.10.2012

Сообщений: 10,095

06.01.2015, 21:43

4

Цитата
Сообщение от Programmer1993
Посмотреть сообщение

не катит

Конечно. Нужно конвертировать строки из файла

Delphi
1
st :=AnsiToUtf8(st);

Зачем Вы трогаете переменную инициализации выходного файла f? Да, и процедура самой конвертации выглядит некорректно.

Добавлено через 1 минуту

Цитата
Сообщение от Programmer1993
Посмотреть сообщение

var W:variant;
var f:TextFile;
var st:string;

жесткое начало



1



44 / 24 / 1

Регистрация: 22.05.2012

Сообщений: 669

06.01.2015, 21:57

 [ТС]

5

Цитата
Сообщение от droider
Посмотреть сообщение

Зачем Вы трогаете переменную инициализации выходного файла f? Да, и процедура самой конвертации выглядит некорректно.
Добавлено через 1 минуту
Сообщение от Programmer1993
var W:variant;
var f:TextFile;
var st:string;
жесткое начало

Ну уж как получилось,

Цитата
Сообщение от droider
Посмотреть сообщение

Код Delphi
1
st :=AnsiToUtf8(st);

а с этим не получилось, кодировка осталась



0



Эксперт Pascal/Delphi

4901 / 2771 / 851

Регистрация: 04.10.2012

Сообщений: 10,095

06.01.2015, 22:00

6

Цитата
Сообщение от Programmer1993
Посмотреть сообщение

кодировка осталась

у Вас Delphi 7? Проблем быть не должно.



1



44 / 24 / 1

Регистрация: 22.05.2012

Сообщений: 669

06.01.2015, 22:05

 [ТС]

7

Цитата
Сообщение от droider
Посмотреть сообщение

у Вас Delphi 7? Проблем быть не должно.

Да, делфи 7, может я что то не так делаю и не туда вставляю ваш код, как должен выглядить код? Куда именно вставлять вашу строчку.



0



droider

Эксперт Pascal/Delphi

4901 / 2771 / 851

Регистрация: 04.10.2012

Сообщений: 10,095

06.01.2015, 23:00

8

Лучший ответ Сообщение было отмечено Programmer1993 как решение

Решение

Programmer1993, подправил Ваш код

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
 W:OLEVariant;
 f:TextFile;
 st:string;
begin
W :=CreateOleObject('Word.Application');
 W.Visible :=False;
 
if not OpenDialog1.Execute then Exit;
 W.Documents.Open(OpenDialog1.FileName);
  st:=AnsiToUtf8(W.ActiveDocument.Range.Text);//здесь можно сразу преобразовать в UTF8
 AssignFile(f, 'word.txt');
 Rewrite(f);
 Write(f, st);
 closeFile(f);
 
W.ActiveDocument.Close;
W.Quit;
W :=UnAssigned;
end;

Проверил. Все Ок. Notepad++ показал кодировку ANSI as UTF-8, т.е. кодировка меняется. Обычный Блокнот тоже изменил кодировку, но не отобразил визуальных изменений.
Зато если открыть выходной файл через WordPad, то наглядно видны изменения. Или можно для проверки кинуть на форму Memo и написать так

Delphi
1
2
3
4
5
6
7
8
...
...
if not OpenDialog1.Execute then Exit;
 W.Documents.Open(OpenDialog1.FileName);
  st:=AnsiToUtf8(W.ActiveDocument.Range.Text);
  Memo1.Text :=st; //проверьте с AnsiToUtf8 и без
...
...

Увидите разницу.



2



44 / 24 / 1

Регистрация: 22.05.2012

Сообщений: 669

06.01.2015, 23:02

 [ТС]

9

Вот да, теперь вижу, СПАСИБО



0



Эксперт Pascal/Delphi

4901 / 2771 / 851

Регистрация: 04.10.2012

Сообщений: 10,095

06.01.2015, 23:04

10

Цитата
Сообщение от Programmer1993
Посмотреть сообщение

теперь вижу

Хорошо. Успехов.



1



44 / 24 / 1

Регистрация: 22.05.2012

Сообщений: 669

07.01.2015, 00:45

 [ТС]

11

Спасибо



0



First of all I recommend you read Marco Cantù’s whitepaper on Unicode in Delphi. I am also assuming from your question (and previous questions), that you are using a Unicode version of Delphi, i.e. D2009 or later.


You can first of all define an AnsiString with codepage 1251 to match your input data.

type
  CyrillicString = type Ansistring(1251);

This is an important step. It says that any data contained inside a variable of this type is to be interpreted as having been encoded using the 1251 codepage. This allows Delphi to perform correct conversions to other string types, as we will see later.

Next copy your input data into a string of this variable.

function GetCyrillicString(const Input: array of Byte): CyrillicString;
begin
  SetLength(Result, Length(Input));
  if Length(Result)>0 then
    Move(Input[0], Result[1], Length(Input));
end;

Of course, there may be other, more convenient ways to get the data in. Perhaps it comes from a stream. Whatever the case, make sure you do it with something equivalent to a memory copy so that you don’t invoke code page conversions and thus lose the 1251 encoding.

Finally you can simply assign a CyrillicString to a plain Unicode string variable and the Delphi runtime performs the necessary conversion automatically.

function ConvertCyrillicToUnicode(const Input: array of Byte): string;
begin
  Result := GetCyrillicString(Input);
end;

The runtime is able to perform this conversion because you specified the codepage when defining CyrillicString and because string maps to UnicodeString which is encoded with UTF-16.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Сколько постов написано в блогах, сколько вопросов задано на форумах о кодировках и ещё большее количество подобных вопросов осталось не отвеченными или ответом было что-то наподобие «Поиском пользовались?» или «Сто раз обсуждалось!!!». Честно говоря, никогда не понимал таких «ответчиков», ИМХО не хочешь отвечать — лучше жуй и молчи, ответят те, кто захочет.
Понятное дело, что обучать иногда приходится не только с помощью пряника, но и с помощью кнута, но, раз уж такие вопросы всё время всплывают, следовательно они остаются актуальными.
Сегодня я попробую рассказать Вам всё, что мне известно о работе с кодировками в тексте. Вполне возможно, что эта статья поможет Вам при разработке своих проектов в Delphi да и у меня уже пару раз возникало желание немного систематизировать ту информацию. которая накопилась за время существования блога.

1. Delphi и Unicode

Если говорить о работе с Unicode в Delphi, то начать стоит с того, что полноценная поддержка unicode в Delphi стала возможна лишь после выхода Delphi 2009. Такое событие не могло пройти незамеченным, так как благодаря поддержке Unicode и, соответственно, для облегчения работы с кодировками текста в Delphi были реализованы новые возможности, методы, типы данных, о которых написано большое количество статей. На мой взгляд одной из лучших публикаций на эту темя является цикл из трех статей «Delphi и кодировка Unicode» где достаточно чётко и доступно рассказано о нововведениях Delphi 2009 для работы с unicod’ом. Думаю, что нет смысла подробно останавливаться на всех новшествах при наличии ссылки на целых три статьи на эту тему. Остается только упомянуть о том, с чем мы сегодня будем работать для представления веб-страницы в нормальном читаемом виде.
Для первого способа работы с кодировкой мы воспользуемся:

  1. Класс TEncoding, который и дает нам возможность без лишних хлопот работать с кодировками
  2. Тип данных TBytes — массива байтов строк
  3. RawByteString — тип для передачи строковых данных для любой кодовой страницы без каких-либо преобразований последней

В одной из статей блога рассматривалась работа с MLang и сегодня, в качестве второго способа, я продемонстрирую Вам пример её применения при работе с кодировками.
Ну и в качестве третьего способа работы с кодировками, воспользуемся «штатными» методами модуля system. Все три варианта работы с кодировками приведут к одному и тому же результату — текст веб-страницы будет читаемым, без «кракозябров» и вопросительных знаков. Какой способ лучше — решать только Вам.

2. Подготовка исходных данных для работы

Прежде, чем начать что-то кодировать и перекодировать, необходимо это «что-то» получить. В нашем случае — текст веб-страницы. Чтобы не залезать слишком глубоко в вопросы, касающиеся новых типов данных будем сохранять все данные из Сети не в строки или TStringList’ы, как мы к этому привыкли, а воспользуемся типом TBytes.
Используя Synapse исходник любой страницы можно получить, например так:

  with THTTPSend.Create do
    begin
      if HTTPMethod('GET',URL)then
        begin
           //в свойстве Document объекта THTTPSend содержится исходник страницы
           //обрабатываем Document 
        end;
    end;

Теперь, получив данные (свойство Document:TMemoryStream) скопируем эти данные в массив байтов строки TBytes, например так (способ достаточно медленный, приведен исключительно для примера):

var B: TBytes;
     i:integer;
begin
//загружаем контент страницы
  with THTTPSend.Create do
    begin
      if HTTPMethod('GET',URL) then
        begin
          Document.Position:=0;
          SetLength(B,Document.Size);
          for i := 0 to Document.Size - 1 do
            Document.Read(B[i],1);
        end;
    end;

Первый этап подготовки можно считать законченным — у нас есть массив байтов строки, которые необходимо представить в виде текста в правильной кодировке. А как узнать, что наш массив TBytes надо перевести в новую «правильную» кодировку? Естественно узнать в какой кодировке была исходная страница. Здесь можно пойти двумя путями:
1. Узнать кодировку из мета-тегов. Обычно кодировка страницы описывается мета-тегом следующего содержания:

META http-equiv="content-type" content="text/html; charset=windows-1251

. Пример того как узнать кодировку из мета-тегов страницы Вы можете посмотреть в модуле HtmlCPConvert, который я выкладывал в блоге, когда рассматривал работу с MLang.
2. Узнать кодировку текста из заголовков сервера. Если рассматривать этот пример, используя для работу с HTTP-протоколом библиотеку Synapse, то заголовки сервера будут содержаться в свойстве Headers:TStringList. Найти элемент, содержащий сведения о кодировке и получить имя кодовой страницы можно, например так:

function GetCharset(Headers: TStringList): string;
var i:integer;
begin
  if Headers.Count=0 then Exit;
  for I := 0 to Headers.Count - 1 do
    begin
      //Content-Type: text/html; charset=UTF-8
      if Pos('content-type',LowerCase(Headers[i]))>0 then
        if pos('=',Headers[i])>0 then
          Result:=LowerCase(Copy(Headers[i],pos('=',Headers[i])+1,Length(Headers[i])-pos('=',Headers[i])))
        else
          Result:=DefCharset;
    end;
end;

Так как в заголовке может отсутствовать сведения о кодировке, то переменная DefCharset должна содержать имя какой-либо дефолтной кодовой страницы, например windows-1251.
Теперь у нас есть все исходные данные:
1. Массив байтов строки B:TBytes;
2. Сведения о кодировке.
Приступим к преобразованию байтов в читабельный текст.

3. Массив байтов — в нормальный текст

3.1. Работа с TEncoding

Разработчики Delphi предусмотрели использование двух взаимопротивоположных метода:

  1. function BytesOf(const Val: RawByteString): TBytes; — получение байтов из строки
  2. function StringOf(const Bytes: TBytes): UnicodeString; — получение строки из массива байтов

Пусть Вас не пугает то, что StringOf возвращает UnicodeString, т.к., начиная с Delphi 2009

type
  UnicodeString = string

Теперь, что касается непосредственно работы с TEncoding. Во-первых, от нас не требуется создавать отдельный экземпляр класса, наподобие такого:

var Enc: TEncoding;
begin
  Enc:=TEncoding.Create;
end;

Во-вторых, с помощью TEncoding мы можем менять кодовую страницу не преобразовывая массив байтов в строку. Для этого класс содержит следующие классовые методы:

class function Convert(Source, Destination: TEncoding; Bytes: TBytes): TBytes; overload;
    class function Convert(Source, Destination: TEncoding; Bytes: TBytes; StartIndex, Count: Integer): TBytes; overload;

Одним из этих методов мы и воспользуемся. Для того, чтобы продемонстрировать работу с TEncoding попробуем получить текст прямо из этого блога. Кодировка UTF-8, именно она наиболее часто является «проблемной» и возвращает в TMemo или ещё куда-либо «кракозябры».
Создадим простое приложение как показано на рисунке:

В ComboBox сразу занесем все варианты работы с текстом:

  1. Без преобразования
  2. TEncoding (модуль SysUtils)
  3. MLang
  4. Utf8ToAnsi (модуль System)

По нажатию кнопки TButton будем грузить страницу в массив байтов и, зависимости от выбранного варианта работы с текстом, преобразовывать массив в строку и выводить в Memo. Для первого варианта (без преобразования) код может быть следующий:

with THTTPSend.Create do
    begin
      if HTTPMethod('GET',Edit1.Text)then
        begin
          Document.Position:=0;
          SetLength(B,Document.Size);
          for i := 0 to Document.Size - 1 do
            Document.Read(B[i],1);
          label4.Caption:=GetCharset(Headers);
        end;
    end;
Label6.Caption:=IntToStr(Length(B))+' байт текста';
case ComboBox1.ItemIndex of
 0:Memo1.Text:=StringOf(B);
[...]
end;

Запускаем приложение и видим:

Как и ожидалось — вместо русских букв кракозябры. Преобразуем их с помощью классового метода TEncoding.Convert:

var astr: String;
     B: TBytes;
[...]
case ComboBox1.ItemIndex of
 0:Memo1.Text:=StringOf(B);
 1:begin
     B:=TEncoding.Convert(TEncoding.UTF8,TEncoding.GetEncoding(1251),B);
     astr:=StringOf(B);
     Memo1.Lines.Add(astr);
   end;
[...]
end;

Здесь следует отметить, что TEncoding.GetEncoding(1251) возвращает кодовую страницу кириллического текста. Если необходимо получить другую кодовую страницу, то можете либо воспользоваться классовыми свойствами TEncoding либо определить кодовую страницу как я, используя данные с MSDN о доступных в Windows кодовых страницах.
Проверим, что получилось в итоге. Грузим ту же самую страницу:

Как видите — кракозябры преобразовались в нормальный русский текст.
Какие плюсы дает нам использование TEncoding? Думаю, что ответ вполне очевиден — у нас появляется под рукой инструмент, позволяющий перекодировать строки из любых кодировок в любые, т.е. фактически возможности работы с текстом ограничиваются количеством доступных в Windows кодовых страниц, а их по данным MSDN 152 штуки. Прикиньте сколько вариантов получится, если в Convert используется пара кодовых страниц. Много :).
Но, наряду с таким большим и жирным плюсом существует и минус — TEncoding есть только в версиях Delphi 2009 и выше, что исключает его использование в более ранних версиях. Как быть?
Если хотите получить не менее впечатляющие возможности работы с кодировками — используйте возможности MLang. Вот как раз и пример его использования.

3.2. Использование возможностей MLang для работы с кодовыми страницами

Позволю себе ещё раз напомнить, что скачать всё необходимое для реализации возможностей MLang Вы можете с этой страницы или, перейдя по этой ссылке. В архиве содержатся всего два модуля: MLang.pas и HtmlCPConvert.pas. Подключаем оба модуля к проекту и для получения читабельного текста пишем:

Memo1.Text:=RawHTMLToHTML(StringOf(B));

RawHTMLToHTML из модуля HtmlCPConvert переводит текст в кодировку windows-1251. Также есть и обратный метод для перевода текста в RawByteString и называется этот метод HTMLToRawHTML.
Результат преобразования текста с помощью MLang абсолютно идентичен предыдущему варианту:

Если Вам необходимо работать со множеством кодировок, как при использовании TEncoding, то придётся самостоятельно немного доработать модуль HtmlCPConvert. В целом возможности TEncoding и MLang вполне сопоставимы.
И, наконец, третий вариант — использование методов модуля System.pas.

3.3. Использование методов System.pas для перекодирования текста

В модуле System.pas можно найти следующие полезные функции для работы с кодировками:

Utf8Encode(const US: UnicodeString): RawByteString;
function UTF8EncodeToShortString(const WS: WideString): ShortString;
function Utf8Decode(const S: RawByteString): WideString;
function UTF8ToUnicodeString(const S: RawByteString): UnicodeString;
function UTF8ToString(const S: RawByteString): string;
function AnsiToUtf8(const S: string): RawByteString;
function Utf8ToAnsi(const S: RawByteString): string;

Как видите, методы завязаны на работе с конкретными кодовыми страницами UTF-8, ANSI, а также на работе с новым типом данных RawByteString. Поэтому возможности третьего способы по сравнению с первыми двумя резко ограничены. Хотя в реалиях нынешнего Рунета их вполне достаточно, т.к. веб-страницы в кодировке koi8-r уже больше раритет, чем обыденность. Использовать методы достаточно просто. Например так:

var RS: RawByteString;
[...]
begin
   RS:=StringOf(B);
   Memo1.Text:=Utf8ToAnsi(RS);
end;

я перевел массив байтов в стоку RawByteString и затем представил её в кодировке Ansi, получив в Memo читабельный русский текст.
Вот три способа работы с различными кодировками текста, которые могут применяться где угодно. И это только часть всех возможностей, которые предоставляет нам Delphi. Какой способ использовать — решать Вам.
Кстати, при работе с кодировками следует обратить внимание на то, что «кракозябры» в тексте — это следствие представления строки с использованием неправильной кодовый страницы. Если же вместо русских букв появляются знаки вопроса, то это следствие того, что в текущей кодовой странице текста нет тех символов, которые вы пробуете показать. Например, представляя текст ANSI в кодировке UTF-8 мы получаем кракозябры, а если попробовать представить текст ANSI Cyrillic (windows-1251) с кодовой страницей ANSI Latin 1 (windows-1252), то вместо русских букв получим знаки вопроса, т.к. в windows-1252 отсутствуют русские буквы и т.д.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Summarize other answers I found 11 main ways to do this (see below). And I wrote some performance tests (see results below):

Ways to convert an InputStream to a String:

  1. Using IOUtils.toString (Apache Utils)

     String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
    
  2. Using CharStreams (Guava)

     String result = CharStreams.toString(new InputStreamReader(
           inputStream, Charsets.UTF_8));
    
  3. Using Scanner (JDK)

     Scanner s = new Scanner(inputStream).useDelimiter("\\A");
     String result = s.hasNext() ? s.next() : "";
    
  4. Using Stream API (Java 8). Warning: This solution converts different line breaks (like \r\n) to \n.

     String result = new BufferedReader(new InputStreamReader(inputStream))
       .lines().collect(Collectors.joining("\n"));
    
  5. Using parallel Stream API (Java 8). Warning: This solution converts different line breaks (like \r\n) to \n.

     String result = new BufferedReader(new InputStreamReader(inputStream))
        .lines().parallel().collect(Collectors.joining("\n"));
    
  6. Using InputStreamReader and StringBuilder (JDK)

     int bufferSize = 1024;
     char[] buffer = new char[bufferSize];
     StringBuilder out = new StringBuilder();
     Reader in = new InputStreamReader(stream, StandardCharsets.UTF_8);
     for (int numRead; (numRead = in.read(buffer, 0, buffer.length)) > 0; ) {
         out.append(buffer, 0, numRead);
     }
     return out.toString();
    
  7. Using StringWriter and IOUtils.copy (Apache Commons)

     StringWriter writer = new StringWriter();
     IOUtils.copy(inputStream, writer, "UTF-8");
     return writer.toString();
    
  8. Using ByteArrayOutputStream and inputStream.read (JDK)

     ByteArrayOutputStream result = new ByteArrayOutputStream();
     byte[] buffer = new byte[1024];
     for (int length; (length = inputStream.read(buffer)) != -1; ) {
         result.write(buffer, 0, length);
     }
     // StandardCharsets.UTF_8.name() > JDK 7
     return result.toString("UTF-8");
    
  9. Using BufferedReader (JDK). Warning: This solution converts different line breaks (like \n\r) to line.separator system property (for example, in Windows to «\r\n»).

     String newLine = System.getProperty("line.separator");
     BufferedReader reader = new BufferedReader(
             new InputStreamReader(inputStream));
     StringBuilder result = new StringBuilder();
     for (String line; (line = reader.readLine()) != null; ) {
         if (result.length() > 0) {
             result.append(newLine);
         }
         result.append(line);
     }
     return result.toString();
    
  10. Using BufferedInputStream and ByteArrayOutputStream (JDK)

    BufferedInputStream bis = new BufferedInputStream(inputStream);
    ByteArrayOutputStream buf = new ByteArrayOutputStream();
    for (int result = bis.read(); result != -1; result = bis.read()) {
        buf.write((byte) result);
    }
    // StandardCharsets.UTF_8.name() > JDK 7
    return buf.toString("UTF-8");
    
  11. Using inputStream.read() and StringBuilder (JDK). Warning: This solution has problems with Unicode, for example with Russian text (works correctly only with non-Unicode text)

    StringBuilder sb = new StringBuilder();
    for (int ch; (ch = inputStream.read()) != -1; ) {
        sb.append((char) ch);
    }
    return sb.toString();
    

Warning:

  1. Solutions 4, 5 and 9 convert different line breaks to one.

  2. Solution 11 can’t work correctly with Unicode text

Performance tests

Performance tests for small String (length = 175), url in github (mode = Average Time, system = Linux, score 1,343 is the best):

              Benchmark                         Mode  Cnt   Score   Error  Units
 8. ByteArrayOutputStream and read (JDK)        avgt   10   1,343 ± 0,028  us/op
 6. InputStreamReader and StringBuilder (JDK)   avgt   10   6,980 ± 0,404  us/op
10. BufferedInputStream, ByteArrayOutputStream  avgt   10   7,437 ± 0,735  us/op
11. InputStream.read() and StringBuilder (JDK)  avgt   10   8,977 ± 0,328  us/op
 7. StringWriter and IOUtils.copy (Apache)      avgt   10  10,613 ± 0,599  us/op
 1. IOUtils.toString (Apache Utils)             avgt   10  10,605 ± 0,527  us/op
 3. Scanner (JDK)                               avgt   10  12,083 ± 0,293  us/op
 2. CharStreams (guava)                         avgt   10  12,999 ± 0,514  us/op
 4. Stream Api (Java 8)                         avgt   10  15,811 ± 0,605  us/op
 9. BufferedReader (JDK)                        avgt   10  16,038 ± 0,711  us/op
 5. parallel Stream Api (Java 8)                avgt   10  21,544 ± 0,583  us/op

Performance tests for big String (length = 50100), url in github (mode = Average Time, system = Linux, score 200,715 is the best):

               Benchmark                        Mode  Cnt   Score        Error  Units
 8. ByteArrayOutputStream and read (JDK)        avgt   10   200,715 ±   18,103  us/op
 1. IOUtils.toString (Apache Utils)             avgt   10   300,019 ±    8,751  us/op
 6. InputStreamReader and StringBuilder (JDK)   avgt   10   347,616 ±  130,348  us/op
 7. StringWriter and IOUtils.copy (Apache)      avgt   10   352,791 ±  105,337  us/op
 2. CharStreams (guava)                         avgt   10   420,137 ±   59,877  us/op
 9. BufferedReader (JDK)                        avgt   10   632,028 ±   17,002  us/op
 5. parallel Stream Api (Java 8)                avgt   10   662,999 ±   46,199  us/op
 4. Stream Api (Java 8)                         avgt   10   701,269 ±   82,296  us/op
10. BufferedInputStream, ByteArrayOutputStream  avgt   10   740,837 ±    5,613  us/op
 3. Scanner (JDK)                               avgt   10   751,417 ±   62,026  us/op
11. InputStream.read() and StringBuilder (JDK)  avgt   10  2919,350 ± 1101,942  us/op

Graphs (performance tests depending on Input Stream length in Windows 7 system)
enter image description here

Performance test (Average Time) depending on Input Stream length in Windows 7 system:

 length  182    546     1092    3276    9828    29484   58968

 test8  0.38    0.938   1.868   4.448   13.412  36.459  72.708
 test4  2.362   3.609   5.573   12.769  40.74   81.415  159.864
 test5  3.881   5.075   6.904   14.123  50.258  129.937 166.162
 test9  2.237   3.493   5.422   11.977  45.98   89.336  177.39
 test6  1.261   2.12    4.38    10.698  31.821  86.106  186.636
 test7  1.601   2.391   3.646   8.367   38.196  110.221 211.016
 test1  1.529   2.381   3.527   8.411   40.551  105.16  212.573
 test3  3.035   3.934   8.606   20.858  61.571  118.744 235.428
 test2  3.136   6.238   10.508  33.48   43.532  118.044 239.481
 test10 1.593   4.736   7.527   20.557  59.856  162.907 323.147
 test11 3.913   11.506  23.26   68.644  207.591 600.444 1211.545

string result = System.Text.Encoding.UTF8.GetString(byteArray);

Delphi — это современная среда разработки приложений на платформе Windows, которая широко используется среди разработчиков. Однако, при разработке многоязычных приложений, часто возникает необходимость смены кодировки.

Кодировки

Кодировка — это способ представления символов в виде чисел (байтов). Существует множество кодировок, таких как ASCII, UTF-8, ISO-8859-1, KOI8 и т.д. В Delphi кодировка по умолчанию — это Windows-1251. Однако, в некоторых случаях может потребоваться сменить кодировку.

Смена кодировки в Delphi

Смена кодировки в Delphi достаточно проста и производится посредством использования компонента TEncoding. Для начала необходимо определить текущую кодировку. Это можно сделать следующим образом:

var
  encoding: TEncoding;
  currentEncoding: String;
begin
  encoding := TEncoding.Default;
  currentEncoding := encoding.EncodingName;
end;

После определения текущей кодировки, можно перекодировать текст в необходимую кодировку. Например, для перекодировки текста из Windows-1251 в UTF-8 необходимо выполнить следующий код:

var
  encoding: TEncoding;
  text: String;
begin
  encoding := TEncoding.Default;
  text := 'Привет, мир!';
  text := encoding.GetString(TEncoding.Convert(TEncoding.Default, TEncoding.UTF8, encoding.GetBytes(text)));
end;

Таким образом, текст будет перекодирован в UTF-8 и сохранен в переменной text.

Заключение

Delphi позволяет с легкостью перекодировать текст в различные кодировки, что может быть полезным при разработке приложений на разных языках. Смена кодировки производится с помощью компонента TEncoding и не требует специальных знаний и умений.

  • За что надо бороться до победы?
  • Нашел новину — ReactOS: что это за система и стоит ли ее устанавливать?
  • Мне кто поможет?
  • Когда сумма модулей двух векторов больше модуля их векторной суммы
  • Нравится ли Вам эта юбка и с чем её можно надеть?
  • А какие у Вас ответы? можно в общем …Какие ?
  • Дайте совет, ребята
  • Мляяяя, да то ж за клавиатура такая ПОШЛАЯ у меня???)))))))))))))

  • Dell vostro 3500 нет звука windows 10
  • Dell inspiron n5110 установка windows 10
  • Delphi ds150e установка на windows 10
  • Dell vostro 3500 драйвера windows 10
  • Dell inspiron n5110 драйвера windows 10 64 bit