Как я могу преобразовать символы Unicode в коды ASCII в Delphi 7? - PullRequest
4 голосов
/ 20 ноября 2008

Да, мы говорим о кодах ASCII. Мои извинения, я здесь не разработчик Delphi.

Ответы [ 7 ]

6 голосов
/ 21 ноября 2008

Для Delphi 7 я бы получил бесплатную библиотеку Unicode от Майка Лишке , которая является автором Virtual Treeview.

Библиотека содержит множество функций преобразования для перехода в Unicode и обратно, поэтому вы можете использовать те из них, которые наиболее целесообразны в вашем приложении.

Или вы можете выполнить обновление до Delphi 2009 , который имеет встроенные процедуры кодирования и собственную библиотеку функций преобразования.

3 голосов
/ 24 мая 2009

Давайте разберемся несколько вещей. Набор символов (кодировка) и кодировки символов - это две взаимосвязанные, но разные концепции. Набор символов - это абстрактный список символов с каким-либо целочисленным кодом. Затем идут кодировки символов, которые в основном представляют собой алгоритм, который описывает, как символы представлены в байтах.

ASCII действует как набор символов и кодировка. Он использует 7 бит для выражения 128 символов (94 для печати). Unicode , с другой стороны, является набором символов, выражающим 1,114,112 кодовых точек. Существует несколько кодировок для представления строк в Юникоде, но наиболее заметными являются UTF-8, UTF-16, UTF-16LE и UTF-32. Другими словами, один символ Unicode может быть представлен различными способами в зависимости от кодировок.

Как я могу преобразовать символы Unicode в коды ASCII в Delphi 7?

Я думаю, что вопрос можно интерпретировать двумя способами.

  1. У меня есть строка Unicode в некоторых кодировках, которая включает только печатные символы ASCII. Как я могу преобразовать строку в байтовый массив кодировки ASCII?

  2. У меня есть строка Unicode в некоторых кодировках, которая также включает не-ASCII печатные символы, такие как китайские символы. Как я могу закодировать строку в кодировку ASCII без потери информации, а затем декодировать ее обратно в исходную строку Unicode?

Если вы имеете в виду первое, вы можете загрузить строку Unicode в WideString, как говорит Осман, и сделать

var
  original: WideString;
  s: AnsiString;
begin
  s := AnsiString(original);

Если вы имеете в виду второе, вам понадобится универсальный алгоритм кодирования, такой как Base64 кодировка. Вы можете использовать DCPBase64.pas , включенный в DCPcrypt v2 Beta 3 . * 1034 Дэвида Бартона.

1 голос
/ 22 ноября 2008

Вы можете использовать функцию в http://swissdelphicenter.ch/en/showcode.php?id=1692
Он преобразует строку Unicode в строку Ansi, используя указанную кодовую страницу.
Если вы хотите конвертировать, используя системную кодовую страницу по умолчанию (определенную в региональных параметрах как кодировка не-unicode), вы можете сделать это просто так:

var
  ws: widestring;
  s: string;
begin
  s:=string(ws)
1 голос
/ 21 ноября 2008

См. Связанные вопросы по конвертации из Unicode в ASCII:

Как правило, набор символов из сотен тысяч записей не может быть преобразован в набор символов из 127 записей без некоторой потери информации или схемы кодирования.

1 голос
/ 21 ноября 2008

«ASCII» - это название определенного отображения символов в числа, но некоторые люди говорят «ASCII-код», когда они на самом деле не означают ASCII вообще; они просто хотят числовое значение символа, независимо от того, какое отображение действует в данный момент. Это описание относится к вам?

Если это так, то вы можете использовать стандартную функцию Ord, чтобы получить значение кодовой точки Unicode любого имеющегося у вас символа Unicode.

var
  wc: WideChar;
  ws: WideString;
  x: Word;

x := Ord(wc);
x := Ord(ws[1]);

Если вы действительно имели в виду ASCII, тогда вам нужно будет более конкретно указать, какой тип конверсии вы имеете в виду.

1 голос
/ 21 ноября 2008

В качестве примера, буква A представлена ​​в юникоде как U + 0041, а в ansi как всего 41. Таким образом, преобразование будет довольно простым, но вы должны выяснить, как кодируется символ Юникода. Наиболее распространенными являются UTF-16 и UTF-8. UTF 16, в основном, два байта на символ, но даже это упрощение, поскольку у символа может быть больше байтов. UTF-8 звучит так, как будто он означает 1 байт на символ, но может быть 2 или 3. Чтобы еще больше усложнить ситуацию, UTF-16 может иметь порядок байтов с прямым или прямым порядком байтов. (U + 0041 или U + 4100).

Если ваш вопрос не имеет смысла, например, если вы хотите преобразовать арабскую букву ain U + 0639 в ansi на английском языке. Вы не можете.

1 голос
/ 20 ноября 2008

Зависит от вашего определения конверсии. Если вы хотите отобразить 127 младших символов в эквивалент Unicode, вы можете использовать явное приведение. Но это создает мусор, если строка содержит более высокие символы.

Если вы хотите сопоставления типа ë -> e и û -> u, вы можете написать свой собственный код. Но помните, что всегда есть символы, которые нельзя преобразовать.

...