Как преобразовать символы Юникода в коды ASCII в Delphi 7?

StackOverflow https://stackoverflow.com/questions/305162

  •  08-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

  

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

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

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

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

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

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

    Если вы имеете в виду второе, вам понадобится универсальный алгоритм кодирования, например Base64 . Вы можете использовать DCPBase64.pas , включенный в состав Дэвида Бартона <. /www.cityinthesky.co.uk/cryptography.html "rel =" nofollow noreferrer "> DCPcrypt v2 Beta 3 .

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

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

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

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

    var
      wc: WideChar;
      ws: WideString;
      x: Word;
    
    x := Ord(wc);
    x := Ord(ws[1]);
    

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

    Например, буква 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 в английском языке.Вы не можете.

    См. соответствующие вопросы по преобразованию из Unicode в ASCII:

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

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

    var
      ws: widestring;
      s: string;
    begin
      s:=string(ws)
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top