Programmer1993 44 / 24 / 1 Регистрация: 22.05.2012 Сообщений: 669 |
||||
1 |
||||
06.01.2015, 20:49. Показов 26503. Ответов 10 Метки нет (Все метки)
есть программа которая берет вордовский файл и конвертирует его в .txt. Но вот на выходе файл в кодировке windows-1251, а мне нужен на выходе чтоб был в utf-8. Помогите это сделать.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
06.01.2015, 20:49 |
10 |
4901 / 2771 / 851 Регистрация: 04.10.2012 Сообщений: 10,095 |
|
06.01.2015, 21:03 |
2 |
на выходе файл в кодировке windows-1251, а мне нужен на выходе чтоб был в utf-8 AnsiToUTF8().
1 |
44 / 24 / 1 Регистрация: 22.05.2012 Сообщений: 669 |
|
06.01.2015, 21:23 [ТС] |
3 |
не катит Миниатюры
0 |
droider 4901 / 2771 / 851 Регистрация: 04.10.2012 Сообщений: 10,095 |
||||
06.01.2015, 21:43 |
4 |
|||
не катит Конечно. Нужно конвертировать строки из файла
Зачем Вы трогаете переменную инициализации выходного файла f? Да, и процедура самой конвертации выглядит некорректно. Добавлено через 1 минуту
var W:variant; жесткое начало
1 |
44 / 24 / 1 Регистрация: 22.05.2012 Сообщений: 669 |
|
06.01.2015, 21:57 [ТС] |
5 |
Зачем Вы трогаете переменную инициализации выходного файла f? Да, и процедура самой конвертации выглядит некорректно. Ну уж как получилось,
Код Delphi а с этим не получилось, кодировка осталась
0 |
4901 / 2771 / 851 Регистрация: 04.10.2012 Сообщений: 10,095 |
|
06.01.2015, 22:00 |
6 |
кодировка осталась у Вас Delphi 7? Проблем быть не должно.
1 |
44 / 24 / 1 Регистрация: 22.05.2012 Сообщений: 669 |
|
06.01.2015, 22:05 [ТС] |
7 |
у Вас Delphi 7? Проблем быть не должно. Да, делфи 7, может я что то не так делаю и не туда вставляю ваш код, как должен выглядить код? Куда именно вставлять вашу строчку.
0 |
droider 4901 / 2771 / 851 Регистрация: 04.10.2012 Сообщений: 10,095 |
||||||||
06.01.2015, 23:00 |
8 |
|||||||
Сообщение было отмечено Programmer1993 как решение РешениеProgrammer1993, подправил Ваш код
Проверил. Все Ок. Notepad++ показал кодировку ANSI as UTF-8, т.е. кодировка меняется. Обычный Блокнот тоже изменил кодировку, но не отобразил визуальных изменений.
Увидите разницу.
2 |
44 / 24 / 1 Регистрация: 22.05.2012 Сообщений: 669 |
|
06.01.2015, 23:02 [ТС] |
9 |
Вот да, теперь вижу, СПАСИБО
0 |
4901 / 2771 / 851 Регистрация: 04.10.2012 Сообщений: 10,095 |
|
06.01.2015, 23:04 |
10 |
теперь вижу Хорошо. Успехов.
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’ом. Думаю, что нет смысла подробно останавливаться на всех новшествах при наличии ссылки на целых три статьи на эту тему. Остается только упомянуть о том, с чем мы сегодня будем работать для представления веб-страницы в нормальном читаемом виде.
Для первого способа работы с кодировкой мы воспользуемся:
- Класс TEncoding, который и дает нам возможность без лишних хлопот работать с кодировками
- Тип данных TBytes — массива байтов строк
- 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 предусмотрели использование двух взаимопротивоположных метода:
- function BytesOf(const Val: RawByteString): TBytes; — получение байтов из строки
- 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 сразу занесем все варианты работы с текстом:
- Без преобразования
- TEncoding (модуль SysUtils)
- MLang
- 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:
-
Using
IOUtils.toString
(Apache Utils)String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
-
Using
CharStreams
(Guava)String result = CharStreams.toString(new InputStreamReader( inputStream, Charsets.UTF_8));
-
Using
Scanner
(JDK)Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : "";
-
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"));
-
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"));
-
Using
InputStreamReader
andStringBuilder
(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();
-
Using
StringWriter
andIOUtils.copy
(Apache Commons)StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, "UTF-8"); return writer.toString();
-
Using
ByteArrayOutputStream
andinputStream.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");
-
Using
BufferedReader
(JDK). Warning: This solution converts different line breaks (like\n\r
) toline.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();
-
Using
BufferedInputStream
andByteArrayOutputStream
(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");
-
Using
inputStream.read()
andStringBuilder
(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:
-
Solutions 4, 5 and 9 convert different line breaks to one.
-
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)
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: что это за система и стоит ли ее устанавливать?
- Мне кто поможет?
- Когда сумма модулей двух векторов больше модуля их векторной суммы
- Нравится ли Вам эта юбка и с чем её можно надеть?
- А какие у Вас ответы? можно в общем …Какие ?
- Дайте совет, ребята
- Мляяяя, да то ж за клавиатура такая ПОШЛАЯ у меня???)))))))))))))