Delphi 7 utf 8

I need to use delphi 7 to convert strings from utf8 to widestring. Could anybody tell me why the following code doesn’t work in delphi 7? The parameter of the Utf8Decode function is just a sample.

In delphi 7 it gives me lot’s of question marks,however in bds2006 it works well.

Do I need to switch some compiler directive on, or how can I convert an utf8String to Widestring in delphi 7?

SOLUTION

There’s nothing wrong with the Utf8Decode function, The Delphi Code Insight Tooltip expression evaluation output misled me, which can’t display Widestrings. see the image below:

but the MessageBoxW could display the text:

Я написал программу с Delphi 7 , которая осуществляет поиск *.srt файлов на жестком диске. Программа выводит имя и путь этих файлов в памятке. Теперь мне нужно преобразовать эти файлы из ANSI в UTF-8, но мне не удалось.

Возможно, вы имели в виду ASCII?

ASCII имеет обратную совместимость с UTF-8. http://en.wikipedia.org/wiki/UTF-8

Функция Utf8Encode принимает строку WideString в качестве параметра и возвращает строку UTF-8.

Посмотрите на GpTextStream , который выглядит , как он работает с Delphi 7. Он имеет возможность чтения / записи Юникода файлы в старых версиях Delphi (хотя работает с Delphi 2009) и должны помочь с преобразованием.

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

Правильный ответ на вопроси это не легко один — в основном состоит из шагов дерева:

  1. Вы должны определить страницу ANSI — код , используемый на вашем компьютере. Вы можете достичь этой цели, используя функцию GetACP () из Windows API. ( Важно: вы должны получить кодовую страницу как можно скорее после извлечения имени файла, так как он может быть изменен пользователем.)
  2. Вы должны преобразовать строку ANSI в Unicode с помощью вызова MultiByteToWideChar () функции API для Windows с правильным параметром CodePage (извлеченной в предыдущем шаге). После этого шага у вас есть UTF-16 строка (практически WideString), содержащий список имен файлов.
  3. Вы должны преобразовать строку Unicode в UTF-8 с помощью UTF8Encode () или API WideCharToMultiByte () Windows. Эта функция возвращает строку UTF-8, что вам необходимо.
Читайте также:  Вредно ли заряжать телефон всю ночь

Однако это решение будет возвращать UTF-8 строку , содержащую строку ввода ANSI, это , вероятно, не самый лучший способ решить ваши проблемы, так как имена файлов могут быть уже повреждены , когда функции ANSI возвращали их, поэтому собственные имена файлов не гарантируется ,

Правильное решение вашей проблемы является способами более сложными:

Если вы хотите быть уверены , что ваш список имен файлов именно чистый, вы должны убедиться , что он не будет преобразован в ANSI вообще . Вы можете сделать это явно с помощью «W» вариант обработки API, файл. В данном случае — конечно — вы не можете использовать TFileStream и другие обработки ANSI файл объектов, но API для Windows вызовов непосредственно.

Это не что трудно, но если у вас уже есть сложные структуры , построенные на TFileStream например , это может быть немного боли в @ss. В этом случае лучшим решением является создание TStream потомок , который использует соответствующий API.

Я надеюсь, что мой ответ поможет вам или кто-то, кто имеет дело с той же проблемой. (Я должен был не так давно.)

В Delphi 7 у меня есть расширение, закодированное с Base64 (которое я получил от веб-службы с результатом WideString):

PD94bWwgdmVyc2lvbj0iMS4wIj8 + DQo8c3RyaW5nPtiq2LPYqjwvc3RyaW5nPg ==

когда я его декодировал, этот результат не UTF-8:

Но когда я расшифровал его с помощью base64decode.org, результат верен:

У меня есть функция EncdDecd для функции DecodeString.

Проблема заключается в том, что вы используете DecodeString . Эта функция в Delphi 7 рассматривает декодированные двоичные данные как кодированные ANSI. И проблема в том, что ваш текст кодируется UTF-8.

Чтобы продолжить работу с блоком EncdDecd вас есть несколько вариантов. Вы можете переключиться на DecodeStream . Например, этот код будет генерировать текстовый файл с кодировкой UTF-8 с вашими данными:

Читайте также:  1 Тб внешний hdd transcend storejet 25h3

Или вы можете продолжить с DecodeString , но затем сразу же декодируете текст UTF-8 в WideString . Как это:

Если содержимое файла может быть представлено в вашем приложении, имеющем традиционную локаль ANSI, вы можете преобразовать эту WideString в обычную AnsiString .

Тем не менее, я действительно не думаю, что использование ANSI-кодированного текста приведет к очень плодотворной жизни программирования. Я призываю вас принять решения Unicode.

Судя по содержанию декодированных данных, это XML. Обычно передается XML-парсеру. Большинство синтаксических анализаторов XML будут принимать кодированные данные UTF-8, поэтому вполне возможно, что base64 может декодироваться в поток памяти с помощью DecodeStream а затем передать этот поток вашему парсеру XML. Таким образом, вам не нужно расшифровывать UTF-8 в текст и позволить парсеру XML иметь дело с этим аспектом.